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)相关推荐

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

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

  2. 二十四种设计模式:策略模式(Strategy Pattern)

    策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...

  3. 锈才学设计模式之 —— 策略模式(Strategy Pattern)

    锈才学设计模式之  -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...

  4. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  5. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...

  6. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  7. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  8. 设计模式-策略模式(Strategy Pattern)

    Define a family of algorithms,encapsulate each one,and make them interchangeable(定义一组算法,将每个算法都封装起来,并 ...

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

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

最新文章

  1. python 速度矢量_最近邻搜索4D空间python快速-矢量化
  2. 解决:无法创建该DNS 服务器的委派
  3. JAVASCRIPT复制到剪贴板
  4. 35-03沉浸式状态栏例子
  5. (0019)iOS 开发之关于__weak修饰NSString以及内存管理的问题
  6. Unity 2D游戏开发快速入门(内部资料)
  7. [心得分享] 我在 GitHub 上学习开源
  8. DDNS 的工作原理及其在 Linux 上的实现--转
  9. 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
  10. 关于Java栈与堆的思考
  11. 定制Sublime主题
  12. c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库
  13. 中国营销界:震惊全球的六种“武器”
  14. vb6.0 listview隐藏水平方向滚动条_为Vuetify的UI组件添加滚动条
  15. Use the onReadyStateChange Property (Visual Basic)
  16. 前端工程师如何与设计师合作能提高效率
  17. 浏览器HTML5 写入文件
  18. 酷我音乐盒官方免费版最新版
  19. 萧红二不二?人是在最日常的生活中流逝的……你窗边革命洪流过去的时候,可能你正在剥一颗鸡蛋
  20. (3)资源管理-- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)

热门文章

  1. AndroidStudio中Attatch debugger to Android Ptocess时 Choose Process后OK是灰色的
  2. C#在循环中使用Random时生成的随机数相同的解决办法
  3. npm升级以及使用淘宝npm镜像
  4. 试论敏捷开发方法的共同特征
  5. 一个高成熟度组织的规程和指南目录
  6. 全网最细笔记java与kotlin的一些异同
  7. java 大于30分钟,如何将会话超时设置为大于30分钟
  8. 汽车新零售转型之路怎么走?你需要知道这些
  9. 神策数据 × 水滴汽车:着眼车主忠诚度,实现转型期逆势增长!
  10. 关于类的非静态函数指针成员变量