Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40803
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-17 11:05
文章分类
文章存档

2015年(28)

我的朋友

分类: Java

2015-04-20 19:09:35

原文地址:Java设计模式之策略模式 作者:woxin317

1. 模式介绍

模式的定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

注:针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。

模式的使用场景

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
  • 需要安全的封装多种同一类型的操作时。
  • 出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。

2. UML类图



角色介绍

  • Context:用来操作策略的上下文环境。
  • Strategy : 策略的抽象。
  • ConcreteStrategyA、ConcreteStrategyB : 具体的策略实现。

3. 模式的简单实现

简单实现的介绍

通常如果一个问题有多个解决方案或者稍有区别的操作时,最简单的方式就是利用if-else or switch-case方式来解决,对于简单的解决方案这样做无疑是比较简单、方便、快捷的,但是如果解决方案中包括大量的处理逻辑需要封装,或者处理方式变动较大的时候则就显得混乱、复杂,而策略模式则很好的解决了这样的问题,它将各种方案分离开来,让操作者根据具体的需求来动态的选择不同的策略方案。 这里以简单的计算操作(+、-、*、/)作为示例:

未使用策略模式


点击(此处)折叠或打开

  1. public static double calc(String op, double paramA, double paramB) {
  2.         if ("+".equals(op)) {
  3.             System.out.println("执行加法...");
  4.             return paramA + paramB;
  5.         } else if ("-".equals(op)) {
  6.             System.out.println("执行减法...");
  7.             return paramA - paramB;
  8.         } else if ("*".equals(op)) {
  9.             System.out.println("执行乘法...");
  10.             return paramA * paramB;
  11.         } else if ("/".equals(op)) {
  12.             System.out.println("执行除法...");
  13.             if (paramB == 0) {
  14.                 throw new IllegalArgumentException("除数不能为0!");
  15.             }
  16.             return paramA / paramB;
  17.         } else {
  18.             throw new IllegalArgumentException("未找到计算方法!");
  19.         }
  20.     }

使用策略模式


  • Calc:进行计算操作的上下文环境。
  • Strategy : 计算操作的抽象。
  • AddStrategy、SubStrategy、MultiStrategy、DivStrategy : 具体的 +、-、*、/ 实现。
具体实现代码如下:


点击(此处)折叠或打开

  1. //针对操作进行抽象
  2.     public interface Strategy {
  3.         public double calc(double paramA, double paramB);
  4.     }

  5.     //加法的具体实现策略
  6.     public class AddStrategy implements Strategy {
  7.         @Override
  8.         public double calc(double paramA, double paramB) {
  9.             // TODO Auto-generated method stub
  10.             System.out.println("执行加法策略...");
  11.             return paramA + paramB;
  12.         }
  13.     }

  14.     //减法的具体实现策略
  15.     public class SubStrategy implements Strategy {
  16.         @Override
  17.         public double calc(double paramA, double paramB) {
  18.             // TODO Auto-generated method stub
  19.             System.out.println("执行减法策略...");
  20.             return paramA - paramB;
  21.         }
  22.     }

  23.     //乘法的具体实现策略
  24.     public class MultiStrategy implements Strategy {
  25.         @Override
  26.         public double calc(double paramA, double paramB) {
  27.             // TODO Auto-generated method stub
  28.             System.out.println("执行乘法策略...");
  29.             return paramA * paramB;
  30.         }
  31.     }

  32.     //除法的具体实现策略
  33.     public class DivStrategy implements Strategy {
  34.         @Override
  35.         public double calc(double paramA, double paramB) {
  36.             // TODO Auto-generated method stub
  37.             System.out.println("执行除法策略...");
  38.             if (paramB == 0) {
  39.                 throw new IllegalArgumentException("除数不能为0!");
  40.             }
  41.             return paramA / paramB;
  42.         }
  43.     }

  44.     //上下文环境的实现
  45.     public class Calc {
  46.         private Strategy strategy;
  47.         public void setStrategy(Strategy strategy) {
  48.             this.strategy = strategy;
  49.         }

  50.         public double calc(double paramA, double paramB) {
  51.             // TODO Auto-generated method stub
  52.             // doing something
  53.             if (this.strategy == null) {
  54.                 throw new IllegalStateException("你还没有设置计算的策略");
  55.             }
  56.             return this.strategy.calc(paramA, paramB);
  57.         }
  58.     }


  59.     //执行方法
  60.     public static double calc(Strategy strategy, double paramA, double paramB) {
  61.         Calc calc = new Calc();
  62.         calc.setStrategy(strategy);
  63.         return calc.calc(paramA, paramB);
  64.     }

二者运行:

点击(此处)折叠或打开

  1. public static void main(String[] args) {
  2.         double paramA = 5;
  3.         double paramB = 21;

  4.         System.out.println("------------- 普通形式 ----------------");
  5.         System.out.println("加法结果是:" + calc("+", paramA, paramB));
  6.         System.out.println("减法结果是:" + calc("-", paramA, paramB));
  7.         System.out.println("乘法结果是:" + calc("*", paramA, paramB));
  8.         System.out.println("除法结果是:" + calc("/", paramA, paramB));

  9.         System.out.println("------------ 策略模式 ----------------");
  10.         System.out.println("加法结果是:" + calc(new AddStrategy(), paramA, paramB));
  11.         System.out.println("减法结果是:" + calc(new SubStrategy(), paramA, paramB));
  12.         System.out.println("乘法结果是:" + calc(new MultiStrategy(), paramA, paramB));
  13.         System.out.println("除法结果是:" + calc(new DivStrategy(), paramA, paramB));
  14.     }

总结

通过简单的代码可以清晰的看出二者的优势所在,前者通过简单的if-else来解决问题,在解决简单问题事会更简单、方便,后者则是通过给予不同的具体策略来获取不同的结果,对于较为复杂的业务逻辑显得更为直观,扩展也更为方便。


阅读(435) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~