当前位置: 首页 > 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建造者模式(Builder Pattern)详解与实践

一、引言 在软件开发中&#xff0c;我们经常会遇到需要创建复杂对象的场景。例如&#xff0c;构建一个包含多个可选参数的对象时&#xff0c;传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;便成为…...

Appium+python自动化(十二)- Android UIAutomator

Android团队在4.1版本&#xff08;API 16&#xff09;中推出了一款全新的UI自动化测试工具UiAutomator&#xff0c;用来帮助开发人员更有效率的完成App的Debug工作&#xff0c;同时对于测试人员也是一大福音&#xff0c;为什么这么说呢&#xff1f; UiAutomator提供了以下两种…...

camera功能真的那么难用吗

背景 Android开发工作过程中&#xff0c;经常需要用到camera相关能力&#xff0c;比如&#xff1a;人脸识别&#xff0c;ai识别&#xff0c;拍照预览&#xff0c;摄像头录制等等需求。都需要使用到camera&#xff0c;且需要拿到camera的预览数据。但是每次开发这块代码都比较繁…...

手机号在网状态查询接口如何用PHP实现调用?

一、什么是手机号在网状态查询接口 通过精准探测手机号的状态&#xff0c;帮助平台减少此类问题的发生&#xff0c;提供更个性化的服务或进行地域性营销 二、应用场景 1. 金融风控 通过运营商在网态查询接口&#xff0c;金融机构可以核验贷款申请人的手机状态&#xff0c;拦…...

【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 引言Redisson基本信息Redisson网站 Redisson应用…...

无人机光纤FC接口模块技术分析

运行方式 1. 信号转换&#xff1a;在遥控器端&#xff0c;模块接收来自遥控器主控板的电信号。 2.电光转换&#xff1a;模块内部的激光发射器将电信号转换成特定波长的光信号。 3.光纤传输&#xff1a;光信号通过光纤跳线传输。光纤利用全内反射原理将光信号约束在纤芯内进行…...

DHCP 动态主机配置协议(Dynamic host configuration protocol)逐层封装过程: DHCP --> UDP --> IP

&#x1f4e6; DHCP 报文逐层封装结构&#xff08;自上而下&#xff09; 应用层&#xff08;DHCP 报文&#xff09; ↓ 传输层&#xff08;UDP 首部&#xff09; ↓ 网络层&#xff08;IP 首部&#xff09; ↓ 数据链路层&#xff08;以太网帧头&#xff09; ↓ 物理层&#x…...

《绩效管理》要点总结与分享

目录 绩效管理与目标设定 绩效管理的循环&#xff1a;PDCA 绩效目标的设定要点 绩效设定的工具&#xff1a;SMART法则 绩效跟踪与评估 刻板印象&#xff1a;STAR法 晕轮效应&#xff1a;对比评价法 近因效应&#xff1a;关键事项评估表 绩效面谈 面谈前准备工作 汉堡…...

从上下文学习和微调看语言模型的泛化:一项对照研究

大型语言模型表现出令人兴奋的能力&#xff0c;但也可以从微调中表现出令人惊讶的狭窄泛化。例如&#xff0c;他们可能无法概括为简单的关系反转&#xff0c;或者无法根据训练信息进行简单的逻辑推理。这些未能从微调中概括出来的失败可能会阻碍这些模型的实际应用。另一方面&a…...

HarmonyOS:Counter计数器组件

一、概述 计数器组件&#xff0c;提供相应的增加或者减少的计数操作。 说明 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二、属性 除支持通用属性外&#xff0c;还支持以下属性。 enableInc enableInc(value: b…...