当前位置: 首页 > news >正文

《设计模式》策略模式

策略模式

前言

先了解一下设计模式的几种类似:

  • 行为型设计模式(Behavioral Design Pattern)是指一组设计模式,它们关注的是对象之间的通信和协作。行为型设计模式描述了对象之间的职责分配和算法的封装,以及如何在运行时动态改变对象的行为。它们的目的是提高系统的灵活性和可复用性,使系统更易于扩展和维护。行为型设计模式通常包括以下几种:
    1. 模板方法模式(Template Method Pattern)
    2. 策略模式(Strategy Pattern)
    3. 观察者模式(Observer Pattern)
    4. 迭代器模式(Iterator Pattern)
    5. 责任链模式(Chain of Responsibility Pattern)
    6. 命令模式(Command Pattern)
    7. 访问者模式(Visitor Pattern)
    8. 备忘录模式(Memento Pattern)
    9. 状态模式(State Pattern)
    10. 中介者模式(Mediator Pattern)
    11. 解释器模式(Interpreter Pattern)
  • 创建型设计模式主要关注对象的创建过程,包括将对象的创建过程抽象化、封装和解耦等。常见的创建型设计模式包括:工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式。
  • 结构型设计模式主要关注对象的组合方式,包括对象之间的组合方式、类之间的组合方式等。常见的结构型设计模式包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式让算法的变化独立于使用算法的客户。

正文

策略模式的优点包括:

  1. 可以方便地增加新的算法,因为每个算法都被封装到了自己的类中,新增加一个算法只需要添加一个新的类就可以了。
  2. 可以方便地切换算法,因为算法之间被解耦,所以可以方便地切换算法。
  3. 可以方便地扩展算法,因为每个算法都被封装到了自己的类中,所以可以方便地扩展算法。
  4. 可以减少代码重复,因为算法之间可以共享代码。
  5. 可以方便地测试算法,因为每个算法都被封装到了自己的类中,所以可以方便地测试算法。

总之,策略模式可以提高代码的灵活性、可扩展性和可维护性。它的应用范围很广,可以用于各种算法的封装和应用。

#include <iostream>
#include <vector>// 抽象策略类
class Strategy {
public:virtual void execute() = 0;
};// 具体策略类A
class ConcreteStrategyA : public Strategy {
public:virtual void execute() {std::cout << "执行策略A" << std::endl;}
};// 具体策略类B
class ConcreteStrategyB : public Strategy {
public:virtual void execute() {std::cout << "执行策略B" << std::endl;}
};// 上下文类
class Context {
public:void setStrategy(Strategy* strategy) {m_strategy = strategy;}void executeStrategy() {if (m_strategy != nullptr) {m_strategy->execute();}}private:Strategy* m_strategy;
};int main() {// 创建策略对象ConcreteStrategyA strategyA;ConcreteStrategyB strategyB;// 创建上下文对象Context context;// 执行策略Acontext.setStrategy(&strategyA);context.executeStrategy();// 执行策略Bcontext.setStrategy(&strategyB);context.executeStrategy();return 0;
}

在上面的代码中,我们定义了一个抽象策略类 Strategy,以及两个具体的策略类 ConcreteStrategyAConcreteStrategyB。这些策略类都实现了 execute 方法,用于执行具体的策略。

我们还定义了一个上下文类 Context,它包含一个成员变量 m_strategy,用于保存当前使用的策略对象。Context 类有两个方法,setStrategyexecuteStrategy,分别用于设置当前使用的策略对象和执行策略。

main 函数中,我们创建了两个具体的策略对象 strategyAstrategyB,以及一个上下文对象 context。我们首先将上下文对象的策略设置为 strategyA,然后调用 executeStrategy 方法执行策略。接着,我们将上下文对象的策略设置为 strategyB,再次执行策略。

这个示例中,策略模式的核心思想就是将具体的算法实现封装到不同的策略类中,通过上下文对象来控制使用哪个策略。这样,我们就可以在运行时动态地切换不同的策略,从而实现灵活的算法组合。

相关文章:

《设计模式》策略模式

策略模式 前言 先了解一下设计模式的几种类似&#xff1a; 行为型设计模式&#xff08;Behavioral Design Pattern&#xff09;是指一组设计模式&#xff0c;它们关注的是对象之间的通信和协作。行为型设计模式描述了对象之间的职责分配和算法的封装&#xff0c;以及如何在运…...

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学&#xff1a;研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑&#xff1a;研究推理的科学 数学方法&#xff1a;引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学&#xff0c;即使用符号化…...

Java8新特性学习

Java8新特性学习为啥使用Lambda表达式Lambda表达式的基础语法无参无返回有参无返回一个参数多参单个语句体类型推断四大内置核心函数式接口其他接口方法引用与构造器引用Stream简介什么是StreamStream操作步骤创建Stream中间操作终止操作(终端操作&#xff09;归约与收集并行流…...

SPARK outputDeterministicLevel的作用--任务全部重试或者部分重试

背景 目前spark的repartition()方法是随机分配数据到下游&#xff0c;这会导致一个问题&#xff0c;有时候如果我们用repartition方法的时候&#xff0c;如果任务发生了重试&#xff0c;就有可能导致任务的数据不准确&#xff0c;那这个时候改怎么解决这个问题呢&#xff1f; …...

图数据库中的 OLTP 与 OLAP 融合实践

在一些图计算的场景下&#xff0c;我们会遇到同时需要处理 OLTP 和 OLAP 的问题。而本文就给了一个 OLTP 与 OLAP 融合实践的指导思路&#xff0c;希望给你带来一点启发。 Dag Controller 介绍 Dag Controller 是 NebulaGraph 企业版的图系统&#xff0c;经过反复测试无误后已…...

Shader Graph简介

使用着色器&#xff08;shader&#xff09;和材质&#xff08;material&#xff09;&#xff0c;我们能够创造出非常多有趣的效果。除了Unity自带的shader外&#xff0c;还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关…...

kubectl

目录 一、陈述式资源管理方法 二、基本信息查看 2.1 基本信息查看格式 2.2 查看master节点组件状态 2.3 查看命名空间 2.4 创建/查看命名空间 2.5 删除&#xff08;重启&#xff09;命名空间/pod 2.6 查看资源的详细信息 2.7 创建副本控制器来启动Pod 2.8 查看指定命…...

实验室设计SICOLAB第三方检测中心实验室设计

第三方检测中心实验室怎么设计&#xff1f;详细设计内容有哪些&#xff1f;功能区域有哪些&#xff1f;仪器有哪些&#xff1f;要多少面积&#xff1f;第三方检测中心实验室是一种独立的实验室&#xff0c;为客户提供各种测试和分析服务。以下是一个第三方检测中心实验室的详细…...

GPS经纬度转距离

function [pN, pE] distance_gps(lon1, lon2, lat1, lat2)d2r pi/180; % deg转radR 6371000.0; % 地球半径pN (lat2 - lat1) * d2r * R;pE (lon2 - lon1) * d2r * R * cos(lat2 * d2r); end...

7-周赛333总结

7-周赛333总结 还是只过了前两题&#xff0c;第三题又写了好久好久&#xff0c;然后也不知道错在了哪里&#xff0c;只过了部分题解&#xff0c;也许是思考不全面吧。下次也许先做第四题更好…第四题今天花了点时间 做出来了个大概 开心 :happy: 合并两个二维数组 - 求和法【…...

电子招标采购系统源码—互联网+招标采购

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…...

SQL注入和XSS攻击

1、SQL注入 所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入&#xff0c;我们必须认定用户输入的数据都是不安全的&#xff0c;我们都需要对用户输…...

js Map的使用

前言&#xff1a;Map数据集可以理解为加强版的对象 一、for...of 1、对象不能用于for of&#xff0c;因其没有部署Iterator接口&#xff1b;其他数据集如&#xff1a;数组、Map、Set、Iterator对象等都可以用for...of2、使用for...of的优势&#xff1a; for of的循环体中可以…...

企业应该怎么管理香港服务器?

做好服务器管理&#xff0c;往往能为站长避免很多麻烦。用户租用服务器&#xff0c;除了希望它快速而安全&#xff0c;还有就是如何才能得到优质及时的售后和指导建议了。服务器供应商只提供服务器管理的基础服务&#xff0c;负责提供硬件、带宽和电力等服务&#xff0c;服务器…...

软件设计(十四)-UML建模(上)

软件设计&#xff08;十三&#xff09;-原码、反码、补码、移码https://blog.csdn.net/ke1ying/article/details/129115844?spm1001.2014.3001.5501 UML建模包含&#xff1a;用例图&#xff0c;类图与对象图&#xff0c;顺序图&#xff0c;活动图&#xff0c;状态图&#xff…...

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后&#xff0c;在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的&#xff0c;但在外网电脑和设备如何访问呢&#xff1f;由于内网环境下&#xff0c;无法提供公网IP使用&#xff0c;外网访问内网就需要一个内外网转换的介质。这里介绍…...

Flink-Table API 和 SQL(基本API、流处理的表、时间属性和窗口、聚合查询、联结查询、函数、SQL客户端、连接到外部系统)

文章目录Table API 和 SQL快速上手基本 API程序架构创建表环境创建表表的查询输出表表和流的转换流处理中的表动态表和持续查询将流转换成动态表原理用 SQL 持续查询-更新查询&追加查询将动态表转换为流(Append-only、Retract、Upsert)时间属性和窗口事件时间处理时间窗口&…...

C++入门:数据抽象

数据抽象是指&#xff0c;只向外界提供关键信息&#xff0c;并隐藏其后台的实现细节&#xff0c;即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程&#xff08;设计&#xff09;技术。让我们举一个现实生活中的真实例子&#xff0c;比如一台电视机&a…...

WRF进阶:使用IO选项控制WRF变量输出/WRF指定变量输出添加/删除

Registry文件 WRF模式在运行求解时&#xff0c;会涉及到大量的数据变量运算&#xff0c;而这些数据变量的管理、规定、控制则需要依赖于WRF的Registry文件&#xff0c;简单来说&#xff0c;它可以理解为管理WRF数据结构的“数据字典”&#xff08;"Active data-dictionar…...

一文读懂功率放大器(功率放大器的特性是什么意思)

功率放大器是一种电子放大器&#xff0c;旨在增加给定输入信号的功率幅度。功率放大器一般要求得到一定的不失真或者较小失真的输出功率&#xff0c;在大信号状态下进行工作&#xff0c;主要是输出较大功率。功率放大器的特性介绍&#xff1a;1、增益功率放大器的增益主要是指放…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...