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

27 篇文章 0 订阅


相关文档: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值