23种设计模式之策略模式

策略模式的定义

定义: 定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换

通俗的说, 就是对一个接口下的一组算法进行封装

其类图如下:

23种设计模式之策略模式

 

其中三个角色说明:

  1. Strategy 抽象策略角色: 策略、算法家族的抽象, 通常为接口, 定义每个策略或算法必须具有的方法和属性
  2. ConcreteStrategy 具体策略角色: 实现抽象策略中的操作, 该类含有具体的算法.
  3. Context封装角色: 也叫上下文角色, 起承上启下封装作用, 屏蔽高层模块对策略、算法的直接访问, 封装可能存在的变化

策略模式的重点就是封装角色, 它借用了代理模式的思路, 差别就是策略模式的封装角色和被封装的策略类不用是同一个接口, 如果是同一个接口就成了代理模式

代码如下:

抽象的策略角色:

23种设计模式之策略模式

 

具体的策略角色:

23种设计模式之策略模式

 

封装角色:

23种设计模式之策略模式

 

场景类:

23种设计模式之策略模式

 

策略模式的应用

策略模式的优点:

  1. 算法可以自由切换. 只要实现抽象策略, 它就成为策略家族的一个成员, 通过封装角色对其进行封装, 保证对外提供"可自由切换"的策略
  2. 避免使用多重条件判断. 如果没有策略模式, 一个策略家族有5个策略算法, 一会要用A,一会要用B, 使用多重的条件语句吗?多重条件语句不易维护, 而且出错的概率大大增强.使用策略模式后, 可以有其他模块决定采用何种策略, 策略家族对外提供的访问接口就是封装类, 简化了操作,同时避免了条件语句判断
  3. 扩展性良好. 在现有的系统中增加一个策略太容易了, 只要实现接口就可以了, 其他的都不用修改,大大符合了OCP原则

策略模式的缺点:

  1. 策略类数量增多. 每一个策略都是一个类, 复用的可能性很小
  2. 所有的策略类都需要对外暴露. 上层模块必须知道有那些策略, 然后才能决定使用哪一个策略, 这与迪米特法则是相违背的. 我们可以使用其他模式来修正这个缺陷, 如工厂方法模式,代理模式或享元模式

策略模式的使用场景:

  1. 多个类只有在算法或行为上稍有不同的场景
  2. 算法需要自由切换的场景. 如, 算法的选择是由使用者决定的, 或者算法始终在进化, 特别是一些技术前沿的行业, 连业务专家都无法给你保证这样的系统规则能够存在多久, 在这种情况下策略模式是你最好的助手
  3. 需要屏蔽算法规则的场景

如果系统中的一个策略家族的具体策略数量超过4个, 则需要考虑使用混合模式, 解决策略类膨胀和对外暴露的问题, 否则日后的系统维护就会成为一个烫手山芋, 谁也不想接


策略模式是一个非常常用的模式, 但它单独使用的地方就比较少了, 因为他有致命缺陷: 所有的策略都需要暴露出去, 这样才方便客户端使用哪一个策略. 在实际项目中, 我们一般通过工厂方法模式来实现策略类的声明.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式之门面模式

门面模式的定义 定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用. 通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道 其类图如下: 其中两个角色如下: Fac…

转载:Android Studio 3.1.2 新项目报错 AAPT2 error: check logs for details (Gradle 3.1.2)

转载自 https://blog.csdn.net/u011618035/article/details/80574645 原本好好的项目,突然有一天打开就开始报错AAPT2 error: check logsfor details。展开错误详细信息错误文本com.android.build.gradle.tasks.ResourceException:Error: java.util.concurrent.Exec…

23种设计模式之迭代器模式

迭代器模式的定义 定义: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节 其类图如下: 其中角色: Iterator 抽象迭代器: 抽象迭代器负责定义访问和遍历元素的接口, 而且基本上是有固定的三个方法: first()获得第一个元素, next()访问下一个元素, i…

23种设计模式之适配器模式

适配器模式的定义 定义: 将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的说, 就是有 A、B两个接口, 现在要求把A和B安装在一起使用, 两者的接口不一致, 怎么办? 引入一个物体C, 如下图: 引入C物体后,…

23种设计模式之组合模式

组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以…

23种设计模式之观察者模式

观察者模式的定义 定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法 其类图如下: 其中的4个角色: Subject 被观察者: 定义被观察者必须实现…

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…

二维码的纠错码原理及细节

参考文档: https://www.thonky.com/qr-code-tutorial/error-correction-coding 1. 消息多项式 消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64…

Android 二维码扫码功能实现(Zxing集成,避坑启示)

这两天想要实现一个能扫码的app,找了一下,发现zxing用的比较多,就在网上找了找怎么用zxing。我主要是按照宇宝守护神的博文“Android 二维码的扫码功能实现(一)”的步骤完成的,博文链接在此:htt…

23种设计模式之桥梁模式

桥梁模式的定义 定义: 将抽象和实现解耦, 使得两者可以独立的变化 通俗的说, 就是一个类调用另一个类中的方法, 需要一个桥梁, 通过聚合的关系调用 其类图如下: 其中角色说明如下: Abstraction 抽象化角色: 它的主要职责是定义出该角色的行为, 同时保存一个对实现化角色的引…

23种设计模式之享元模式

享元模式的定义 定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…