设计模式 之 策略模式
设计模式 之 策略模式
定义
提供几个算法策略,选择其中一个策略去执行。
优点
- 由于将算法封装成单独的策略,策略可以灵活切换。
- 扩展性好,符合开闭原则。
缺点
- 策略多,类也会变多
- 策略类需要对外暴露
代码
场景
常见的加、减、乘、除,客户端选择其中一个算法进行计算。
代码
IOperation
/** * 操作接口 * @author GaoYuan * @date 2018/11/11 下午2:45 */ public interface IOperation { /** 执行计算 */ int operation(int a,int b); }
加、减、乘、除具体的算法实现类
/** * 加法 */ public class AddOperation implements IOperation{ @Override public int operation(int a, int b) { return a + b; } } /** * 减法 */ public class SubOperation implements IOperation{ @Override public int operation(int a, int b) { return a - b; } } /** * 乘法 */ public class MulOperation implements IOperation{ @Override public int operation(int a, int b) { return a * b; } } /** * 除法 */ public class DivOperation implements IOperation{ @Override public int operation(int a, int b){ if(b == 0){ return 0; } return a / b; } }
Context
/** * 使用者 * @author GaoYuan * @date 2018/11/11 下午2:51 */ public class Context { IOperation iOperation; public Context(IOperation iOperation) { this.iOperation = iOperation; } public int execute(int a, int b){ return iOperation.operation(a, b); } }
测试
public static void main(String[] args){ // 加 Context context = new Context(new AddOperation()); System.out.println(context.execute(6,2)); // 减 context = new Context(new SubOperation()); System.out.println(context.execute(6,2)); // 乘 context = new Context(new MulOperation()); System.out.println(context.execute(6,2)); // 除 context = new Context(new DivOperation()); System.out.println(context.execute(6,2)); }
结果输出:
8 4 12 3
策略模式 与 状态模式 区别
相同点
- 类的结构都差不多
不同点
- 状态模式 侧重 状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,根据状态改变行为。
- 策略模式 侧重 调用者选择其中一种策略进行执行。根据不同的条件选择不同的策略。
策略模式 与 简单工厂模式 区别
相同点
- 最终结果是一致的,都是根据某个情景,执行最终的算法
不同点
概念上,或者说最本质的区别
- 简单工厂模式属于创建型模式,调用者,根据条件,可以获取直接创建好的目标对象,然后调用该对象对应的方法即可。
- 策略模式属于行为型模式,调用者需要先创建Context对象,然后自行选择算法,以便具体调用。
当然,在一定程度上,两者也可以相结合。
码云
博客
https://my.oschina.net/gmarshal/blog/2876104
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript异步编程:Generator与Async
从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱。 Promise是下边要讲的Generator/yield与async/await的基础,希望你已经提前了解了它。 在大概ES6的时代,推出了Generator/yield两个关键字,使用Generator可以很方便的帮助我们建立一个处理Promise的解释器。 在ES7左右,我们又得到了async/await这样的语法,可以让我们以接近编写同步代码的方式来编写异步代码(无需使用.then()或者回调函数)。 两者都能够帮助我们很方便的进行异步编程,但同样,这两者之间也是有不少区别的。 #Generator Generator是一个函数,可以在函数内部通过yield返回一个值(此时,Generator函数的执行会暂定,直到下次触发.next()) 创建一个Generator函数的方法是在function关键字后添加*标识。 在调用一个Generator函数后,并不会立即执行其中的代码,函数会返回一个Generator对象,通过调用对象的next函数,可以获得yield/re...
- 下一篇
Vue props用法小结
Vue props用法详解 组件接受的选项之一 props 是 Vue 中非常重要的一个选项。父子组件的关系可以总结为: props down, events up 父组件通过 props 向下传递数据给子组件;子组件通过 events 给父组件发送消息。 父子级组件 比如我们需要创建两个组件 parent 和 child。需要保证每个组件可以在相对隔离的环境中书写,这样也能提高组件的可维护性。 这里我们先定义父子两个组件和一个 Vue 对象: var childNode = { template: ` <div>childNode</div> ` }; var parentNode = { template: ` <div> <child></child> <child></child> </div> `, components: { child: childNode }//前端全栈学习交流圈:866109386 };//帮助1-3Ian前端人员,突破技术瓶颈,提升思维能力 new Vue...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果