【C++ 设计模式】策略模式与简单工厂模式的结合

news2024/11/19 21:32:53

文章目录

  • 前言
  • 一、为什么需要策略模式+简单工厂模式
  • 二、策略模式+简单工厂模式实现原理
  • 三、UML图
  • 四、示例代码
  • 总结


前言

在软件设计中,常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式,它们分别解决了对象行为的抽象和对象创建的抽象问题。在某些情况下,将这两种模式结合起来可以更好地满足实际需求,提高代码的灵活性和可维护性。

策略模式与简单工厂模式的结合:

策略模式用于定义一系列算法,将每个算法封装到独立的类中,并使它们可以相互替换,从而使得算法可以独立于客户端而变化。简单工厂模式用于封装对象的创建过程,将对象的创建与客户端解耦。

将策略模式与简单工厂模式结合起来,可以使得在创建具体策略对象时更加灵活,同时保持了策略对象的封装性。通过简单工厂模式,我们可以根据客户端的需求动态创建不同的具体策略对象,而策略模式则确保了这些对象可以被客户端无缝地使用。


一、为什么需要策略模式+简单工厂模式

当我们面对需要根据不同情况选择不同算法或行为的情况时,策略模式是一个很好的选择。它允许我们将不同的算法封装成独立的类,并且可以在运行时灵活地切换这些算法,而不影响客户端代码。然而,单独使用策略模式时,我们需要在客户端代码中显式地创建具体策略对象,这可能导致代码变得复杂,尤其当需要根据不同条件选择不同的策略时。

这时候,简单工厂模式可以派上用场。简单工厂模式提供了一个统一的接口来创建对象,客户端只需提供简单的参数,而不必了解具体对象的创建过程。将策略模式与简单工厂模式结合起来,可以在需要时动态地创建不同的具体策略对象,同时保持代码的简洁和可维护性。简单工厂模式负责对象的创建,而策略模式确保了这些对象可以被灵活地使用,让我们的软件更加智能和适应变化。这种结合使用的设计模式能够提高代码的灵活性、可扩展性和可维护性,使得软件系统更加健壮和易于理解。

二、策略模式+简单工厂模式实现原理

  • 策略模式:

首先定义一个策略接口(或抽象类),其中包含定义了一系列算法的方法。
创建具体的策略类,分别实现策略接口中的方法,每个具体策略类代表一个具体的算法。
在客户端中,持有一个策略接口的指针(或引用),可以动态切换不同的具体策略对象。
当客户端需要使用某个具体的算法时,调用策略接口中定义的方法即可。

  • 简单工厂模式:

创建一个工厂类,负责根据传入的参数来创建具体的对象。
工厂类中包含一个方法,根据不同的参数返回不同的具体对象实例。

  • 结合实现原理:

在策略模式中,客户端通常需要显式地创建具体策略对象,这可能会导致代码的复杂性。
为了解决这个问题,可以将具体策略对象的创建委托给简单工厂,通过简单工厂模式动态地创建具体的策略对象。
这样,客户端只需要和简单工厂打交道,向工厂传递参数即可获取所需的具体策略对象,而无需直接创建对象。
当需要在运行时根据不同条件选择不同的策略时,可以通过简单工厂来创建不同的策略对象,然后使用策略模式来执行具体的算法。

三、UML图

在这里插入图片描述
通过UML图可以发现简单工厂模式和策略模式+简单工厂模式非常的像啊!其主要差别就是工厂生成的类有一个统一执行的函数execute函数用来变成策略模式,进而就有了策略模式的特征了

四、示例代码

#include <iostream>
#include <memory>

// 抽象策略类
class Strategy {
public:
    virtual void execute() const = 0;
    virtual ~Strategy() {}
};

// 具体策略类 A
class ConcreteStrategyA : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing strategy A\n";
    }
};

// 具体策略类 B
class ConcreteStrategyB : public Strategy {
public:
    void execute() const override {
        std::cout << "Executing strategy B\n";
    }
};

// 工厂类,用于创建具体策略对象
class StrategyFactory {
public:
    static Strategy* createStrategy(char type) {
        switch (type) {
        case 'A':
            return new ConcreteStrategyA;
        case 'B':
            return new ConcreteStrategyB;
        default:
            throw std::invalid_argument("Invalid strategy type");
        }
    }
};

int main() {
    // 使用工厂类创建具体策略对象
    auto strategyA = StrategyFactory::createStrategy('A');
    auto strategyB = StrategyFactory::createStrategy('B');

    // 执行策略
    strategyA->execute();
    strategyB->execute();

    return 0;
}

在这里插入图片描述
抽象策略类(Strategy):定义了执行策略的接口 execute(),所有具体策略类都要实现这个接口。

具体策略类(ConcreteStrategyA 和 ConcreteStrategyB):实现了具体的策略,分别是策略 A 和策略 B。它们提供了不同的行为实现方式。

工厂类(StrategyFactory):用于创建具体策略对象。createStrategy 方法根据传入的参数类型决定创建哪种具体策略对象。

主函数(main):在 main 函数中,通过工厂类创建了具体的策略对象 strategyA 和 strategyB,分别对应策略 A 和策略 B。然后调用这些策略对象的 execute() 方法执行相应的策略。

实现决策的原理在于通过工厂类的 createStrategy 方法根据输入的参数类型来动态创建具体的策略对象。这种方式使得客户端代码与具体策略对象的创建过程解耦,同时利用了策略模式的灵活性,能够在运行时动态地切换不同的策略。


总结

策略模式与简单工厂模式的结合,能够很好地将对象的行为和对象的创建分离,使得系统更具灵活性和可扩展性。通过将具体策略对象的创建委托给简单工厂,我们可以在不改变客户端代码的情况下动态地切换不同的策略,从而更好地满足不同的业务需求。这种结合使用的设计模式在实际项目中具有广泛的应用价值,可以帮助我们更好地组织和管理代码结构,提高代码的可维护性和可扩展性。

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

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

相关文章

字节面试: Mysql为什么用B+树,不用跳表?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团、蚂蚁、得物的面试资格&#xff0c;遇到很多很重要的相关面试题&#xff1a; Mysql用B树&#xff0c;不用跳表&…

JVM垃圾收集器-serial.parNew,parallelScavnge,serialOld,parallelOld,CMS,G1

垃圾收集器 分代模型 适用于新生代&#xff1a; serial parNew parallel Scaavenge 适用于老年代&#xff1a; CMS serial Old(msc) paraller Old 分区模型 适用于超大容量&#xff1a; G1 分代模型 serial /serial Old收集器 1.单线程收集器 2.收集时会暂停其他线程&…

java学习之路-程序逻辑控制

目录 1.分支结构 1.1 if语句 栗子 判断奇数还是偶数 判断一个年份是否为闰年 1.2switch语句 栗子 2. 循环结构 2.1while 循环 栗子 2.2break和continue break continue 2.3for循环 基本语法 栗子 2.4 do while 循环 3.输入输出 3.1输出 3.2从键盘输入 栗子…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…

2024年初中生古诗文大会备考:多选题真题和独家解析(持续更新)

今天我们继续来做初中古诗文大会的一道难题&#xff1a;多选题&#xff0c;让大家了解初中生古诗文大会的考察内容和形式&#xff0c;并且提供了我独家的题目解析和答案&#xff0c;供初中的同学们学习和参考。 Tips&#xff1a;古诗文大会的许多题目都来自于中考、高考&#…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎&#xff0c;在插件中搜索“twinmotion”&#xff0c;勾选如下两个插件&#xff0c;然后重启虚幻引擎 3. 打开Twinmotion&#xff0c;随便添加一个物体 导出…

html canvas怎么在图片上面加文字

在HTML canvas中&#xff0c;要让文字显示在图片上方&#xff0c;你需要按照以下步骤操作&#xff1a; 首先&#xff0c;使用drawImage()方法将图片绘制到canvas上。 然后&#xff0c;使用fillText()或strokeText()方法在canvas上绘制文本。 以下是一个简单的示例代码&#…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;三&#xff09;&#xff1a;使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

C++第五弹---类与对象(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 类与对象 1、类对象模型 1.1、如何计算类对象的大小 1.2、类对象的存储方式猜测 1.3、结构体内存对齐规则 2、this指针 2.1、this指针的引出 2.2…

Android U pipeline-statusbar

Android U - statusbar pipeline 写在前面 Android原生从T开始对SystemUI进行MVVM改造&#xff0c;U上状态栏部分进行了修改&#xff1b;第一次出现修改不会删除原有逻辑&#xff0c;而是两版并行&#xff0c;留给其他开发者适配的时间&#xff1b;在下一个大版本可能会删除原…

flask库

文章目录 flask库1. 基本使用2. 路由路径和路由参数3. 请求跳转和请求参数4. 模板渲染1. 模板变量2. 过滤器3. 测试器 5. 钩子函数与响应对象 flask库 flask是python编写的轻量级框架&#xff0c;提供Werkzeug&#xff08;WSGI工具集&#xff09;和jinjia2&#xff08;渲染模板…

SpringBoot+Vue.js协同过滤算法美食推荐小程序

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的&#xff0c;所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套协同过滤算法美食推荐小程序&#xff0c;帮助…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法&#xff0c;如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

SimpleDateFormat类 --java学习笔记

SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式 常见构造器和方法&#xff1a; pattern 代表需要应用的时间格式—— 时间格式的常见符号&#xff1a; 时间格式的应用举例&#xff1a; import java.text.SimpleDate…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列&#xff09;简称MQ&#xff0c;是一种应用程序对应用程序的消息通信机制。在MQ中&#xff0c;消息以队列形式存储&#xff0c;以便于异步传输&#xff0c;在MQ中&#xff0c;发布者&#xff08;生产者&#xff09;将消息放入队列&#xff…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

最后十几天!未备案小程序将会被清退

微信官方通知 2023年8月9日&#xff0c;微信公众平台发布了“关于开展微信小程序备案的通知”&#xff1a; 去年就已经在逐步推进备案了&#xff0c;新注册小程序必须备案才可以上架。若微信小程序已上架&#xff0c;须于2024年3月31日前完成备案&#xff0c;逾期未完成备案&a…

苹果大模型MM1强势来袭!300亿参数所向披靡

功能展示 左图问&#xff1a;图片中有多少个苹果&#xff1f; 苹果大模型答&#xff1a;7个 左图问&#xff1a;这些州中哪一个是最北的&#xff1f; 回答&#xff1a;Delaware 追问&#xff1a;其他的州是什么&#xff1f; 回答&#xff1a;Arizona, Oklahoma, North Caro…

Ant Design Pro complete版本的下载及运行

前言 complete 版本提供了很多基础、美观的页面和组件&#xff0c;对于前端不太熟练的小白十分友好&#xff0c;可以直接套用或者修改提供的代码完成自己的页面开发&#xff0c;简直不要太爽。故记录一些下载的步骤。 环境 E:\code>npm -v 9.8.1E:\code>node -v v18.1…

[HTML]Web前端开发技术24(HTML5、CSS3、JavaScript )JavaScript基础JavaScript,Netscape,事件处理代码,外部JS——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…