策略模式(Strategy)、枚举策略模式
策略模式(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)、枚举策略模式相关推荐
- [设计模式](十):策略模式(Strategy)与模板模式(Template)详解及二者间区别介绍(两种父子类行为模式)
这次要说的两个模式,都是行为模式,指的是在程序运行过程中,经过经验总结的行为开发模式. 其次,行为模式再按照类与类间关系的划分,可以划分为四个类型:父子关系(2种).独立类间关系(4种).类自身状态( ...
- 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?
文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...
- 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)
七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 进阶学习(3.14) Strategy Pattern 策略模式
1, 什么是策略模式 1.1 未达到预期目的的各种应对方案 1.2 程序代码中的每一个分支都可以称之为策略, 而策略模式,则是将行为划分到具体类, 使用类对象区分行为 2, 优缺点 2.1 减少 ...
- 策略模式的扩展——策略枚举
策略枚举就是这样一个枚举: 它是一个枚举. 它是一个浓缩了的策略模式的枚举. public enum Calculator { //加法运算 ADD("+"){ public in ...
- 策略模式(Strategy)简介
一, 回顾简单工厂模式(SimpleFactory) 上一篇博文: http://blog.csdn.net/nvd11/article/details/41855937 还是用回那个计算器作例子. ...
- 设计模式实战-策略模式(Strategy Pattern)
0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...
最新文章
- [DevOps] 认识一下
- 怎么查找表_MySQL索引是怎么支撑千万级表的快速查找?
- 来51的时间也不短了,开始写blog了。
- SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测
- python类库的查找
- 从甲方到乙方,如何做好混沌工程的行业化落地
- 【代码规范】google开源c\c++项目代码规范
- centos6.5卸载java_删除CentOS6.5系统自带的jdk
- Qt文件编码转换工具(二) C++判断文件编码
- [书目20170308]卓有成效的管理者
- Python验证码识别初探(tesserocr库)
- PHP网站实现地址URL重定向
- Redis-秒杀场景应用
- Java工程师需要掌握哪些知识和专业技能呢?
- c语言程序设计操作,c语言编程入门相关详细操作
- LCD显示屏加入百叶窗特效显示BMP图片
- Xcode 8 过滤系统输出
- 多线程学习--案例-子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次
- 数字拼音翻译成阿拉伯数字
- [收藏]基于Spark Graphframes的社交关系图谱项目实战
热门文章
- C#获取字符串中某个字符出现的次数
- golang panic: assignment to entry in nil map(map赋值前要先初始化 - map的初始化及使用 )
- Go新手上路(时不时更新)
- c语言中运用空语句的延时函数,【转载】单片机C语言中_nop_函数的使用及C语言的延时计算...
- MySQL硬件软件中断_mysql 服务突然中断
- linux vim与less区别,linux中cat、more、less命令区别详解##less 最合适最好用,和vim一样好用...
- 路径中,连续多个目录分隔符不影响,仍按照一个处理
- 帮助干活,朋友馈赠了购物卡
- 全网首发:解决JDK绘制位图字体的旋转位置错误
- BUG没确认就重启机器,大哥你凭什么说有这样的BUG