策略模式(Strategy)、枚举策略模式

标签:Strategy 休闲 策略模式 职场 枚举

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://haolloyin.blog.51cto.com/1177454/343464

策略模式(Strategy):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。

适用场景:

1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法;

2、需要使用一个算法的不同变体;

3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构;

4、一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy 类中以代替这些条件语句。

通用类图:

实际上,策略模式是采用了面向对象的继承和多态机制,客户根据自己的业务需要调用上下文(Context 类)获得相应的具体策略、算法实现。

假设我们要实现一个非常简单的计算机,只能进行加减操作。一般我们会这样设计:根据传入的 String 型参数使用 if… else… 语句判断用户需要哪种操作。

代码如下:

class Calculator {  private final static String ADD = "+";  private final static String SUB = "-";   public int calculate  (int a, int b, String operator) {     int result = 0;       if(this.ADD.equals(operator)) { result = a + b;       }else {    result = a - b;          }    return result;  } }
// 测试类  public class Client {  public static void main(String[] args) { Calculator calculator = new Calculator();      System.out.println(calculator.calculate(10, 13, "+"));  System.out.println(calculator.calculate(10, 13, "-"));  }
}

这样的设计比较死板,如果我们要实现乘除法呢?就不得不修改 Calculator  类中的 operation()方法,改变 if… else…语句的结构。 为了适应变化,使用策略模式来重新设计。

代码如下:

// 定义算法框架,具体的算法由子类实现  interface Operation {  public int calculate(int a, int b);  }  class Add implements Operation {  public int calculate(int a, int b) {     return (a + b);    } }  class Sub implements Operation {  public int calculate(int a, int b) { return (a - b); } }
// 上下文 Context 类  class Calculator {  private Operation operation;        // 设置具体的算法策略      public void setOperation (Operation operation) {   this.operation = operation;  }          public int calculate(int a, int b) { return this.operation.calculate(a, b); } } // 测试类  public class Client { public static void main(String[] args) {      Calculator calculator = new Calculator();                   // 加法操作          calculator.setOperation(new Add());         System.out.println(calculator.calculate(20, 13));                    // 减法操作        calculator.setOperation(new Sub());     System.out.println(calculator.calculate(20, 13));  }}

如果此时我们需要添加乘除法,只需要再写一个实现了 Operation 接口的类,并实现其具体策略即可,在客户端即可方便地调用。

下面使用枚举策略的方式来实现,代码如下:

// 策略枚举
enum Calculator {   // 加法策略的实现      Add(){  public int calculate(int a, int b) {    return (a + b);        }    },  // 这里用逗号隔开各个枚举变量            // 减法策略的实现 Sub(){          public int calculate(int a, int b) { return (a - b);    }   }; // 这里用逗号结束枚举变量的定义    // 定义抽象算法方法,让每个枚举变量来具体实现      public abstract int calculate(int a, int b);  } public class Client {   public static void main(String[] args) { // 加法          System.out.println(Calculator.Add.calculate(20, 13));   // 减法          System.out.println(Calculator.Sub.calculate(20, 13)); }}

使用枚举策略模式,不足是并不能像上面第二种方式那样适应变化,原因是如果要添加其他策略,同样需要修改枚举类,即添加具体的枚举变量。不过枚举策略的代码结构确实比较简洁。由于枚举策略的模式也不适合扩展,因此适合担任不会频繁发生变化的角色。

策略模式是比较简单的一个模式了,但是它也有不足之处:所有的具体策略都必须暴露给客户,否则客户怎样根据自身需要使用不同的策略呢?而且,策略模式实际上是把条件判断的逻辑(即各个条件分支,也就是每个具体策略)转移到客户端了,由客户来选择不同的具体策略。

转载于:https://blog.51cto.com/5618698/1636536

策略模式(Strategy)、枚举策略模式相关推荐

  1. [设计模式](十):策略模式(Strategy)与模板模式(Template)详解及二者间区别介绍(两种父子类行为模式)

    这次要说的两个模式,都是行为模式,指的是在程序运行过程中,经过经验总结的行为开发模式. 其次,行为模式再按照类与类间关系的划分,可以划分为四个类型:父子关系(2种).独立类间关系(4种).类自身状态( ...

  2. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  3. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  4. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式- Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

  6. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  7. 进阶学习(3.14) Strategy Pattern 策略模式

    1, 什么是策略模式 1.1  未达到预期目的的各种应对方案 1.2  程序代码中的每一个分支都可以称之为策略, 而策略模式,则是将行为划分到具体类, 使用类对象区分行为 2, 优缺点 2.1  减少 ...

  8. 策略模式的扩展——策略枚举

    策略枚举就是这样一个枚举: 它是一个枚举. 它是一个浓缩了的策略模式的枚举. public enum Calculator { //加法运算 ADD("+"){ public in ...

  9. 策略模式(Strategy)简介

    一, 回顾简单工厂模式(SimpleFactory) 上一篇博文: http://blog.csdn.net/nvd11/article/details/41855937 还是用回那个计算器作例子. ...

  10. 设计模式实战-策略模式(Strategy Pattern)

    0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...

最新文章

  1. [DevOps] 认识一下
  2. 怎么查找表_MySQL索引是怎么支撑千万级表的快速查找?
  3. 来51的时间也不短了,开始写blog了。
  4. SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测
  5. python类库的查找
  6. 从甲方到乙方,如何做好混沌工程的行业化落地
  7. 【代码规范】google开源c\c++项目代码规范
  8. centos6.5卸载java_删除CentOS6.5系统自带的jdk
  9. Qt文件编码转换工具(二) C++判断文件编码
  10. [书目20170308]卓有成效的管理者
  11. Python验证码识别初探(tesserocr库)
  12. PHP网站实现地址URL重定向
  13. Redis-秒杀场景应用
  14. Java工程师需要掌握哪些知识和专业技能呢?
  15. c语言程序设计操作,c语言编程入门相关详细操作
  16. LCD显示屏加入百叶窗特效显示BMP图片
  17. Xcode 8 过滤系统输出
  18. 多线程学习--案例-子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次
  19. 数字拼音翻译成阿拉伯数字
  20. [收藏]基于Spark Graphframes的社交关系图谱项目实战

热门文章

  1. C#获取字符串中某个字符出现的次数
  2. golang panic: assignment to entry in nil map(map赋值前要先初始化 - map的初始化及使用 )
  3. Go新手上路(时不时更新)
  4. c语言中运用空语句的延时函数,【转载】单片机C语言中_nop_函数的使用及C语言的延时计算...
  5. MySQL硬件软件中断_mysql 服务突然中断
  6. linux vim与less区别,linux中cat、more、less命令区别详解##less 最合适最好用,和vim一样好用...
  7. 路径中,连续多个目录分隔符不影响,仍按照一个处理
  8. 帮助干活,朋友馈赠了购物卡
  9. 全网首发:解决JDK绘制位图字体的旋转位置错误
  10. BUG没确认就重启机器,大哥你凭什么说有这样的BUG