设计模式 之 策略模式
设计模式 之 策略模式
定义
提供几个算法策略,选择其中一个策略去执行。
优点
- 由于将算法封装成单独的策略,策略可以灵活切换。
- 扩展性好,符合开闭原则。
缺点
- 策略多,类也会变多
- 策略类需要对外暴露
代码
场景
常见的加、减、乘、除,客户端选择其中一个算法进行计算。
代码
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之Promise对象
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。 Promise 对象是一个代理对象(代理一个值),被代理的值在 Promise 对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的 Promise 对象。 Promise 对象有以下两个特点: 对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功) 和 rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。 Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和 从 pending 变为 rejecte...
-
下一篇
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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS7,8上快速安装Gitea,搭建Git服务器