设计模式5-策略模式(Strategy)

设计模式5-策略模式

  • 简介
  • 目的
  • 定义
  • 结构
    • 策略模式的结构
    • 要点
  • 举例说明
    • 1. 策略接口
    • 2. 具体策略类
    • 3. 上下文类
    • 4. 客户端代码
  • 策略模式的反例
    • 没有使用策略模式的代码
  • 对比分析

简介

策略模式也是属于组件协作模式一种。现代软件专业分工之后的第一个结果是框架语音应用程序的划分。组建协作模式,通过晚期绑定来实现框架与应用程序之间的松耦合。组件协作是二者之间协作时常用的模式。

目的

在软件构建过程中,某些对象使用的算法可能多种多样。会经常改动。如果将这些算法都编码到对象中,将会使对象变得异常复杂。而且有时候不支持使用的算法也是一个性能负担。如何在运行时根据需要透明的更改对象的算法?将算法与对象本身上进行解耦。策略模式的目的就是避免上述问题。

定义

程序中定义一系列算法。把他们一个个封装起来。并且使他们可互相替换变化该模式使得算法可独立于使用它的客户程序而变化扩展或者进行子类化。

结构

在这里插入图片描述

策略模式的结构

策略模式包含以下几个部分:

  1. 策略接口(Strategy Interface):定义所有支持的算法的接口。
  2. 具体策略类(Concrete Strategy Classes):实现策略接口的具体算法。
  3. 上下文类(Context Class):包含一个策略对象的引用,并提供设置和执行策略的方法。

要点

策略模式及其子类为组件提供了一系列可重用的算法。从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。并且它提供了用条件判断语句以外的另一种选择。消除条件判断语句就是在解耦合。还有许多条件判断语句的代码通常都需要用策略模式去替换原有代码。如果策略模式对象没有实例变量那么各个上下文可以共享同一个策略模式的对象。从而节省对象开销。

举例说明

策略模式(Strategy Pattern)是一种行为设计模式,定义了算法族,并将每个算法封装起来,使它们可以互换。策略模式让算法的变化不会影响到使用算法的客户。

1. 策略接口

class Strategy {
public:virtual ~Strategy() {}virtual void execute() const = 0;
};

2. 具体策略类

class ConcreteStrategyA : public Strategy {
public:void execute() const override {std::cout << "ConcreteStrategyA executed" << std::endl;}
};class ConcreteStrategyB : public Strategy {
public:void execute() const override {std::cout << "ConcreteStrategyB executed" << std::endl;}
};

3. 上下文类

class Context {
private:Strategy* strategy;public:Context(Strategy* strategy = nullptr) : strategy(strategy) {}~Context() {delete strategy;}void setStrategy(Strategy* newStrategy) {delete strategy;strategy = newStrategy;}void executeStrategy() const {if (strategy) {strategy->execute();} else {std::cout << "No strategy set" << std::endl;}}
};

4. 客户端代码

int main() {Context context;context.setStrategy(new ConcreteStrategyA());context.executeStrategy();context.setStrategy(new ConcreteStrategyB());context.executeStrategy();return 0;
}

策略模式的反例

反例展示了没有使用策略模式时的代码,这样的代码往往存在代码重复、维护困难、扩展不便的问题。

没有使用策略模式的代码

class Context {
public:enum StrategyType {STRATEGY_A,STRATEGY_B};void executeStrategy(StrategyType type) const {switch (type) {case STRATEGY_A:std::cout << "Strategy A executed" << std::endl;break;case STRATEGY_B:std::cout << "Strategy B executed" << std::endl;break;default:std::cout << "No valid strategy selected" << std::endl;break;}}
};int main() {Context context;context.executeStrategy(Context::STRATEGY_A);context.executeStrategy(Context::STRATEGY_B);return 0;
}

对比分析

  • 正例(策略模式)

    • 可扩展性:可以轻松地添加新策略,而无需修改上下文类。
    • 可维护性:每个策略封装在独立的类中,代码更易读、更易维护。
    • 开闭原则:对扩展开放,对修改关闭。
  • 反例(未使用策略模式)

    • 可扩展性差:添加新策略需要修改上下文类的代码。
    • 可维护性差:所有策略代码集中在一个类中,代码量大,维护困难。
    • 违背开闭原则:每次添加新策略都需要修改上下文类,容易引入新的错误。

通过策略模式,代码的灵活性和可维护性显著提高,可以轻松地添加、删除或更改策略,而不影响客户端代码。

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

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

相关文章

Linux文件IO操作的学习

文件IO&#xff1a; 文件描述符最小是0&#xff0c;非负数 Open的返回值是3&#xff0c;因为0&#xff0c;1&#xff0c;2被占用了。 read&#xff1a; 使用read和write实现cat操作 实现cp复制操作&#xff1a; 生成与原文件大小一致的空洞文件 文件IO和标准IO互相转换可以使用…

OnlyOffice-8.1版本深度测评

2024年6月19日&#xff0c;ONLYOFFICE 发布了最新版本 8.1&#xff0c;带来了超过30项新功能和432个 bug 修复。本文将详细评测该版本的新功能和改进&#xff0c;帮助用户全面了解这一升级带来的实际体验提升。 一、功能全面的 PDF 编辑器 PDF 是日常工作中不可或缺的文件格式…

JS【详解】Symbol (含Symbol 作为属性名,态方法for 和 keyFor,11 个内置的 Symbol 值)

ES6 语法&#xff0c;表示唯一且不可变的值&#xff0c;常用作属性键值或者唯一标识符。 let a Symbol() let a Symbol(atomic symbol)console.log(Symbol() Symbol()) // false console.log(Symbol(atom) Symbol(atom)) // falseSymbol 作为属性名 let key Symbol(); le…

上海展会闭幕RFID技术助力档案管理

上海国际智慧档案展于近日圆满落幕&#xff0c;各参展企业在展会上展示了最新的档案管理技术和解决方案。其中&#xff0c;铨顺宏以其创新的技术和出色的表现&#xff0c;吸引了众多业内人士和观众的关注。 在此次展会上&#xff0c;铨顺宏展示了其全新的RFID智能档案管理。能够…

overlap_filter 学习笔记

overlap_filter overlap_filter 函数的通俗含义是根据给定的掩码&#xff08;filter_mask&#xff09;&#xff0c;逐层地过滤掉主掩码&#xff08;mask&#xff09;中的某些值。具体来说&#xff0c;该函数会从最后一个通道开始&#xff0c;逐层检查并根据对应层的过滤掩码&a…

哈啰集团全面接入通义灵码,AI 生成代码占比 20%,研发提效 12%

6 月 21 日&#xff0c;在阿里云 AI 智领者峰会上海站&#xff0c;哈啰集团算法总监贾立宣布&#xff0c; 哈啰集团已全面接入阿里云通义灵码专属版&#xff0c; 不仅提升了内部研发效率&#xff0c;实现 AI 代码采用率超过 20%&#xff0c;还将灵码接入了哈啰自研 Copilot “海…

【CPP】插入排序:直接插入排序、希尔排序

目录 1.插入排序1.1直接插入排序简介代码分析 1.2直接插入对比冒泡排序简介代码对比分析(直接插入排序与冒泡的复杂度效率区别) 1.3希尔排序简介代码分析 1.插入排序 基本思想&#xff1a;把一个待排数字按照关键码值插入到一个有序序列中&#xff0c;得到一个新的有序序列。 …

“Cannot resolve ch.qos.logback:logback-classic:1.2.3”问题解决办法

当我们添加依赖配置时&#xff0c;通常会遇见如下错误&#xff1a; 这个问题是由于项目中使用了 logback-classic 版本1.2.3&#xff0c;但是无法从当前所配置的仓库中解析到这个特定的版本。可以尝试检查依赖配置&#xff0c;确保指定的仓库中包含了 logback-classic 版本1.2.…

MCU的最佳存储方案CS创世 SD NAND

大家都知道MCU是一种"麻雀"虽小&#xff0c;却"五脏俱全"的主控。它的应用领域非常广泛&#xff0c;小到手机手表&#xff0c;大到航空航天的设备上都会用到MCU.市面上目前几个主流厂商有意法半导体&#xff08;其中最经典的一款就是STM32系列&#xff09;…

Android Gradle 使用Task打包APK配置指定输出目录和文件名

想要实现的效果 通过运行Gradle的Task来执行打包操作&#xff0c;无需使用Android Studio的UI操作指定APK文件的输出目录和文件名&#xff0c;需要包含&#xff1a;版本类型&#xff0c;根项目名&#xff0c;打包时间证书不加入版本控制&#xff0c;密码等敏感信息不写入build…

【思科】IPv6 过渡技术 - IPv6 in IPv4隧道

【思科】IPv6 过渡技术 - IPv6 in IPv4隧道 实验要求实现思路IPv6 in IPv4 与 GRE 不同点注意点配置R1基础配置OSPFv3 局域网可达 R2基础配置局域网环境(OSPFv3)&#xff1a;IPv6 网络IPv6 in IPv4隧道 R3R4基础配置局域网环境(OSPFv3)&#xff1a;IPv6 网络IPv6 in IPv4隧道 R…

【机器学习】——【线性回归模型】——详细【学习路线】

目录 1. 引言 2. 线性回归理论基础 2.1 线性模型概述 2.2 最小二乘法 3. 数学基础 3.1 矩阵运算 3.2 微积分 3.3 统计学 4. 实现与应用 4.1 使用Scikit-learn实现线性回归 4.2 模型评估 5. 深入理解 5.1 多元线性回归 5.2 特征选择 5.3 理解模型内部 6. 实战与项…

【智能算法】人工免疫算法

目录 一、概述 二、人工免疫算法主要特点 2.1自适应性 2.2 鲁棒性 2.3 多样性 2.4 并行性 三、人工免疫算法基本原理 四、人工免疫算法应用领域 五、人工免疫算法matlab代码解析 一、概述 人工免疫算法(Artificial Immune Algorithm,简称AIA)是一种模拟自然界中免疫…

算法学习DAY01

目录 一、算法优劣的核心指标 二、常数时间操作 1、常见的常数时间的操作 2、位运算 &#xff08;1&#xff09;&#xff08;<<&#xff09;左移运算符 &#xff08;2&#xff09;&#xff08;>>&#xff09;右移运算符 &#xff08;3&#xff09;&#xff0…

第27课 原理图的简介

什么是原理图&#xff1f; 原理图就是由元器件连接而成的电路图&#xff0c;它表征了你所设计电路的基本原理。 原理图上的所有元器件&#xff0c;都要从你所画好的元器件符号库中调用。元器件的信息会显示在原理图上&#xff0c;如型号、位号、特性值等。 按照我们的设计&am…

WPF/C#:数据绑定到方法

在WPF Samples中有一个关于数据绑定到方法的Demo&#xff0c;该Demo结构如下&#xff1a; 运行效果如下所示&#xff1a; 来看看是如何实现的。 先来看下MainWindow.xaml中的内容&#xff1a; <Window.Resources><ObjectDataProvider ObjectType"{x:Type local…

【2024.6.25】今日 IT之家精选新闻

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

电线电缆电性能试验方法练习题

一、单选题 1.单、双臂电桥的测量范围,下面哪个符合( )。 A、单臂电桥范围1-99.9Ω B、单臂电桥范围100Ω以上 C、单臂电桥范围1Ω以下 D、根据操作者爱好 参考答案:B 解析:GB/T 3048.4-2007 1 2.根据《电线电缆电性能试验方法第4部分:导体直流电阻试验》GB/T 3048.4…

电源集成:智能真无线耳机设计中的通信接口

真无线耳机&#xff08;TWS 耳机&#xff09;由于电池寿命更长、功能更强大、设计更吸引人以及价格更优惠&#xff0c;因此继续变得更具吸引力。随着耳机制造商专注于小型化和设计改进&#xff0c;并迅速采用功能来增强用户体验&#xff0c;他们能够在强大且竞争激烈的市场中吸…

vue大纲

Vue介绍 Vue是一套用于构建前端用户界面的前端框架 前端开发者主要的工作,就是为了网站的使用者(又称为网站的用户)构建出美观舒适的网页 构建用户界面的传统方式 在传统的web前端开发中,基于jQuery 模板引擎的方式来构建用户界面的 使用vue构建用户界面 使用vue构建用户界面…