Java面向对象设计模式(十三)——策略模式(strategy)

来源:互联网 发布:淘宝联盟17年还赚钱吗 编辑:程序博客网 时间:2024/04/30 23:24


相关文档:Java面向对象设计模式


策略模式(strategy)

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

       一种方法是 需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:


图中ICalculator提供同意的方法,AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:

首先统一接口:

[java] view plain copy
  1. public interface ICalculator {  
  2.     public int calculate(String exp);  
  3. }  

辅助类:

[java] view plain copy
  1. public abstract class AbstractCalculator {  
  2.       
  3.     public int[] split(String exp,String opt){  
  4.         String array[] = exp.split(opt);  
  5.         int arrayInt[] = new int[2];  
  6.         arrayInt[0] = Integer.parseInt(array[0]);  
  7.         arrayInt[1] = Integer.parseInt(array[1]);  
  8.         return arrayInt;  
  9.     }  
  10. }  

三个实现类:

[java] view plain copy
  1. public class Plus extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"\\+");  
  6.         return arrayInt[0]+arrayInt[1];  
  7.     }  
  8. }  
[java] view plain copy
  1. public class Minus extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"-");  
  6.         return arrayInt[0]-arrayInt[1];  
  7.     }  
  8.   
  9. }  
[java] view plain copy
  1. public class Multiply extends AbstractCalculator implements ICalculator {  
  2.   
  3.     @Override  
  4.     public int calculate(String exp) {  
  5.         int arrayInt[] = split(exp,"\\*");  
  6.         return arrayInt[0]*arrayInt[1];  
  7.     }  
  8. }  

简单的测试类:

[java] view plain copy
  1. public class StrategyTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String exp = "2+8";  
  5.         ICalculator cal = new Plus();  
  6.         int result = cal.calculate(exp);  
  7.         System.out.println(result);  
  8.     }  
  9. }  

输出:10


另一种方法是 定义一个抽象策略类,定义所有支持的算法的公共接口;具体策略类封装所有的算法或行为,继承于抽象类;添加一个辅助类来维护队抽象类的引用(可有可无)。关系图如下:



抽象算法类,Strategy类,定义所有支持的算法的公共接口

        public abstract class Strategy{      //算法方法      public abstract void AlgorithmInterface();}
三个具体实现类

public class ConcreteStrategyA extends  Strategy{          //算法A实现方法          @Override          public void AlgorithmInterface(){                //算法A的实现          }}

public class ConcreteStrategyB extends  Strategy{          //算法B实现方法          @Override          public void AlgorithmInterface(){                //算法B的实现          }}

public class ConcreteStrategyC extends  Strategy{          //算法C实现方法          @Override          public void AlgorithmInterface(){                //算法C的实现          }}

public class Context{        Strategy strategy;        public Context(Strategy strategy){              this.strategy=strategy;        }        public void ContextInterface(){                 strategy.AlgorithmInterface();        }}
测试类


[java] view plain copy
  1. public class StrategyTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Context context;
  5.         context=new Context(new ConcreteStrategyA());
  6.         context.ContextInterface();
  7.         context=new Context(new ConcreteStrategyB());
  8.         context.ContextInterface();
  9.         .......
  10.     }  


总结:策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。













0 0
原创粉丝点击