Java设计模式:[1]策略模式

2025-11-09 01:19:15

1、定义:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

2、策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:

Java设计模式:[1]策略模式

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

首先统一接口:

public interface ICalculator {      

      public int calculate(String exp);  

}  

4、辅助类:

public abstract class AbstractCalculator {        

    public int[] split(String exp,String opt){         

        String array[] = exp.split(opt);         

         int arrayInt[] = new int[2];         

         arrayInt[0] = Integer.parseInt(array[0]);          

         arrayInt[1] = Integer.parseInt(array[1]);        

         return arrayInt;   

   }  

}  

5、三个实现类:

public class Plus extends AbstractCalculator implements ICalculator {                @Override    

  public int calculate(String exp) {        

        int arrayInt[] = split(exp,"\\+");         

        return arrayInt[0]+arrayInt[1];    

    } 

 } 

public class Minus extends AbstractCalculator implements ICalculator {        @Override    

  public int calculate(String exp) {        

        int arrayInt[] = split(exp,"-");        

        return arrayInt[0]-arrayInt[1];   

   }   

 }  

public class Multiply extends AbstractCalculator implements ICalculator {    

    @Override     

    public int calculate(String exp) {          

       int arrayInt[] = split(exp,"\\*");       

       return arrayInt[0]*arrayInt[1];     

 }  

}  

6、简单的测试类:

public class StrategyTest {       

    public static void main(String[] args) {      

          String exp = "2+8";         

          ICalculator cal = new Plus();       

          int result = cal.calculate(exp);         

          System.out.println(result);  

    }  

}  

7、输出:10

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

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢