设计模式实战-策略模式(Strategy Pattern)
0 联系我
1.Q群【Java开发技术交流】:jq.qq.com/?_wv=1027&a… 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.com/people/shi-… 4.gayhub:github.com/Wasabi1234
0.0 相关源码链接
github.com/Wasabi1234/…
1 定义
也叫做政策模式(Policy Pattern)
- 维基百科 对象有某个行为,但是在不同的场景中,该行为有不同的实现算法. 比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法.
- 定义 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.
在运行时
(非编译时)改变软件的算法行为
- 主要思想 定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后.
策略模式使用的就是面向对象的继承和多态机制
策略模式的三个角色 ● Context 封装角色 也叫做上下文角色,起承上启下封装作用; 屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化.
● Strategy抽象策略角色 策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性
● ConcreteStrategy具体策略角色 实现抽象策略中的操作,含有具体的算法
通用源码
- 抽象策略角色,它是一个非常普通的接口,在我们的项目中就是一个普通得不能再普通的接口了,定义一个或多个具体的算法
2 适用场景
针对一个对象,其行为有些是固定的不变的,有些是容易变化的,针对不同情况有不同的表现形式。那么对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而是希望以动态的形式,针对不同情况产生不同的应对策略。那么这个时候就要用到策略模式了。简言之,策略模式就是为了应对对象中复杂多变的行为而产生的。
- 系统有很多类,而他们的区别仅仅在于他们的行为不同
- 一个系统需要动态地在几种算法中选择一种
3 优点
- 符合开闭原则
- 避免使用多重条件转移语句 比如省去大量的 if/else 和 switch 语句,降低代码的耦合
- 提高算法的保密性和安全性 只需知道策略的作用,而不关心内部实现
4 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 产生很多策略类
5 相关设计模式的差异
策略模式和工厂模式
- 行为型 接收已经创建好的对象,从而实现不同的行为
- 创造型 接收指令,创建出符合要求的具体对象
策略模式和状态模式
- 若系统中某个类的某个行为存在多种实现方式,客户端需要知道到底使用哪个策略
- 若系统中某个对象存在多种状态,不同状态下的行为又具有差异性,状态之间会自动转换,客户端不需要关心具体状态
6 实战
改造后的测试类 可见 if/else 语句过多,采取策略+工厂模式结合
- 策略工厂
- 最新测试类
- 输出结果
7 源码应用解析
JDK中的比较器接口
- 策略比较器 比如Arrays类中的 sort 方法通过传入不同比较接口器的实现达到不同排序策略
JDK中的TreeMap
类似于促销活动中有促销策略对象,在T reeMap 中也有比较器对象
compare 方法进步加工
Spring 中的Resource
不同访问策略
Spring 中bean 的初始化ceInstantiationStrategy
- 两种 bean 的初始化策略
转载于:https://juejin.im/post/5c3ed8c6e51d455221610451
设计模式实战-策略模式(Strategy Pattern)相关推荐
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- 设计模式——策略模式( Strategy Pattern )
写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...
- 设计模式-策略模式(Strategy Pattern)
Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
最新文章
- python 速度矢量_最近邻搜索4D空间python快速-矢量化
- 解决:无法创建该DNS 服务器的委派
- JAVASCRIPT复制到剪贴板
- 35-03沉浸式状态栏例子
- (0019)iOS 开发之关于__weak修饰NSString以及内存管理的问题
- Unity 2D游戏开发快速入门(内部资料)
- [心得分享] 我在 GitHub 上学习开源
- DDNS 的工作原理及其在 Linux 上的实现--转
- 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
- 关于Java栈与堆的思考
- 定制Sublime主题
- c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库
- 中国营销界:震惊全球的六种“武器”
- vb6.0 listview隐藏水平方向滚动条_为Vuetify的UI组件添加滚动条
- Use the onReadyStateChange Property (Visual Basic)
- 前端工程师如何与设计师合作能提高效率
- 浏览器HTML5 写入文件
- 酷我音乐盒官方免费版最新版
- 萧红二不二?人是在最日常的生活中流逝的……你窗边革命洪流过去的时候,可能你正在剥一颗鸡蛋
- (3)资源管理-- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)