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

设计模式二:策略模式 (Strategy Pattern)

策略模式是一种行为设计模式,它定义类一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法 的变化不会影响使用算法 的客户端。

主要组成

  1. 策略接口 (Strategy Interface)

    • 定义所有支持的算法或行为的公共接口

  2. 具体策略类 (Concrete Strategies)

    • 实现策略接口的具体算法或行为

  3. 上下文类 (Context)

    • 持有一个策略对象的引用

    • 提供一个接口让策略对象访问其数据

    • 可以定义一个接口让策略对象返回计算结果

优点

  • 开闭原则:可以在不修改上下文类的情况下引入新策略

  • 消除条件语句:避免使用大量的条件语句来选择不同的算法

  • 算法复用:可以在不同的环境中复用相同的策略

适用场景

  • 当需要在运行时选择不同的算法变体时

  • 当一个类有多种行为,且这些行为以多个条件语句的形式出现时

  • 当需要隔离算法的实现细节与使用它的代码时

 代码比较

非策略模式代码
class doWorkClass
{int doWork(){if (…) {…}else if (…) {…}..//每增加一种算法就往后面添加if else 违背了开闭原则,}};

策略模式代码

//基类
class doWorkBase
{
public:virtual int doWork() = 0;virtual ~doWorkBase();
};//继承类,重写虚函数实现
class doWorkClass1 : public doWorkBase {
public:int doWork() override{……}
};class doWorkClass2 : public doWorkBase {
public:int doWork() override{……}
};//调用类,通过调用不同的子类对象实现不同的算法
class workClass
{
public:void setDoWork(doWorkBase * doWork){m_pDoWork = doWork;}void doWork(){m_pDoWork->doWork();}private:doWorkBase *m_pDoWork;};

 uml结构


文章转载自:
http://browsability.dmyyro.cn
http://antelucan.dmyyro.cn
http://aden.dmyyro.cn
http://acetify.dmyyro.cn
http://acheb.dmyyro.cn
http://campanulaceous.dmyyro.cn
http://anon.dmyyro.cn
http://biodegradable.dmyyro.cn
http://axminster.dmyyro.cn
http://camphor.dmyyro.cn
http://allusive.dmyyro.cn
http://cattywampus.dmyyro.cn
http://airhead.dmyyro.cn
http://abrogation.dmyyro.cn
http://beadle.dmyyro.cn
http://anaesthesia.dmyyro.cn
http://avesta.dmyyro.cn
http://carat.dmyyro.cn
http://bimotor.dmyyro.cn
http://break.dmyyro.cn
http://armadillo.dmyyro.cn
http://blastodisc.dmyyro.cn
http://bricole.dmyyro.cn
http://cacodaemon.dmyyro.cn
http://buildup.dmyyro.cn
http://brassware.dmyyro.cn
http://back.dmyyro.cn
http://cantar.dmyyro.cn
http://bookmatches.dmyyro.cn
http://carissima.dmyyro.cn
http://www.dtcms.com/a/280406.html

相关文章:

  • 云计算如何提高企业的数据安全性和隐私保护
  • 我会秘书长杨添天带队赴杭州融量农业发展有限公司考察调研
  • NQTT-基础知识
  • CSS :root伪类详解:实现动态主题切换的关键所在
  • 7.15 Java基础|大小写转换、数组、ArrayList类
  • 基于Langchain4j开发AI编程助手
  • Python_1
  • 高等数学强化——导学
  • 【Python练习】044. 编写一个函数,实现快速排序算法
  • 第十三讲 | map和set的使用
  • JavaDemo——使用CGLIB动态代理
  • I3C通信驱动开发注意事项
  • 【雅思播客016】New Year Resolution 新年决心
  • docker搭建freeswitch实现点对点视频,多人视频
  • 极致cms多语言建站|设置主站默认语言与设置后台固定语言为中文
  • 嵌入式学习-PyTorch(4)-day21
  • 多相机depth-rgb图组完整性分拣器_MATLAB实现
  • @[TOC](模拟) # 1.替换所有的问号(easy)
  • 学C++做游戏,先搞懂这些基础要点
  • 《大数据技术原理与应用》实验报告六 Flink编程实践
  • 使用JS编写用户信息采集表单
  • 【Python3-Django】快速掌握DRF:ModelViewSet实战指南
  • OneCode 3.0 从0到1干货——AIGC及MCP注解驱动开发物联网AI决策应用
  • 全新 Python 项目托管到 Gitee 私有仓库完整流程(带详细命令注释)
  • OpenVINO initialization error: Failed to find plugins.xml file
  • uv 使用指导文档
  • 【机器学习深度学习】LoRA 微调详解:大模型时代的高效适配利器
  • BlueLotus XSS管理后台使用指南
  • GeoTools 工厂设计模式
  • 传输协议和消息队列