【C++】策略模式

news/2025/2/14 3:48:41/

目录

  • 一、简介
    • 1. 含义
    • 2. 特点
  • 二、实现
    • 1. 策略接口(Strategy Interface)
    • 2. 具体策略类(Concrete Strategies)
    • 3. 上下文类(Context)
    • 4. 使用策略模式
  • 三、总结
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

一、简介

1. 含义

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法封装到不同的类中,并且使它们可以相互替换。策略模式允许客户端代码选择算法的实现,而不是将算法的选择硬编码在客户端代码中。

2. 特点

  • 优点:
  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。
  • 缺点:
  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

二、实现

​ 策略模式中,首先定义一个抽象基类或接口,它代表着所有可能被应用的算法的共性。然后我们编写具体的子类实现这个接口,并实现各自的算法函数。最后,我们编写一个环境类或上下文类,该类持有一个指向抽象基类或接口类型的指针,客户端可以传递不同的具体算法对象给环境类或上下文类,从而动态地改变其行为。

以下是策略模式的关键组成部分:

1. 策略接口(Strategy Interface)

策略的抽象基类或者接口,该类定义了所有可能被应用的算法的共性。定义抽象的函数算法让继承的子类实现。

// 策略接口
class Strategy 
{
public:virtual void execute() const = 0;
};

2. 具体策略类(Concrete Strategies)

它们继承自 Strategy 类,并实现了各自的算法函数,即函数的具体功能的实现。

// 具体策略类 A
class ConcreteStrategyA : public Strategy 
{
public:void execute() const override {std::cout << "执行策略 A" << std::endl;}
};// 具体策略类 B
class ConcreteStrategyB : public Strategy 
{
public:void execute() const override {std::cout << "执行策略 B" << std::endl;}
};

3. 上下文类(Context)

维持一个对策略对象的引用,可以在运行时切换不同的策略。该类持有一个指向抽象基类或接口类型的指针,客户端可以传递不同的具体算法对象给环境类,从而动态地改变其行为(多态)。上下文类有一个executeStrategy()方法,该方法会调用持有的策略对象的 execute() 函数来执行具体算法。

// 上下文类
class Context 
{
private:Strategy* strategy;public:Context(Strategy* strategy) : strategy(strategy) {}void setStrategy(Strategy* newStrategy) {strategy = newStrategy;}void executeStrategy() const {strategy->execute();}
};

使用策略模式的主要优势在于,它允许在运行时选择算法,而不是在编译时进行硬编码。这使得系统更加灵活,易于扩展,同时也符合开闭原则。

4. 使用策略模式

main() 
{ConcreteStrategyA strategyA;ConcreteStrategyB strategyB;Context context(&strategyA);context.executeStrategy(); // 执行策略 Acontext.setStrategy(&strategyB);context.executeStrategy(); // 执行策略 Breturn 0;
}

上述例子中,Context 类可以在运行时切换不同的策略,而不需要修改客户端代码。这符合策略模式的核心思想。

三、总结

​ 策略模式是对象行为型模式 ,它关注行为和算法的封装 。其优势在于可以将算法的实现和使用分离,它定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。方便客户端动态地替换策略对象,并且可以避免使用多重条件语句来选择不同的算法实现。使得算法可独立于使用它的客户而变化。即可以通过直接调用基类的方式完成赋值。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述


http://www.ppmy.cn/news/1269496.html

相关文章

libtorch常用函数记录

先占个坑&#xff0c;后续再整理。 文章目录 创建Tensor创建随机Tensor创建Zeros Tensor创建Ones Tensor从内存中读取数据创建Tensor从Opencv Mat数据创建Tensor从Tensor数据创建Opencv Mat 其他切片判断/设置Tensor内存连续强转数据类型切换Tensor DeviceSqueeze/Unsqueeze使用…

几本学习中整理和面试的PDF,以及精选面试资料

今天和大家分享我在学习过程中整理的笔记&#xff0c;以及我在准备面试中&#xff0c;阅读的PDF&#xff0c;包括Spring Cloud学习手册、Docker学习手册、RabbitMQ学习手册、Spring 6手册、Maven手册、22w字面试手册等等&#xff0c;包括了大部分后端技术以及大部分高频面试题&…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰&#xff0c;今天总结了一下&#xff0c;分享给大家 老师说&#xff1a; 学习是一件“逆人性”的事&#xff0c;就像锻炼身体一样&#xff0c;需要人持续付出&#xff0c;会让人感到痛苦&#…

【c】数组元素移动

本题的难点之处就是不让你创建新的数组&#xff0c;而且移动的距离也没有给限制&#xff0c;比如有7个数&#xff0c;本题没有限制必须移动距离小于7&#xff0c;也可能移动的距离大于7&#xff0c;甚至更多&#xff0c;下面附上我的代码 #include<stdio.h>int main() {…

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

智能冶钢厂环境监控与设备控制系统(边缘物联网网关)

目录 1、项目背景 2、项目功能介绍 3、模块框架 3.1 架构框图 3.2 架构介绍 4、系统组成与工作原理 4.1 数据采集 4.2 指令控制 4.3 其他模块 4.3.1 网页、qt视频流 4.3.2 qt搜索进程 5、成果呈现 6、问题解决 7、项目总结 1、项目背景 这个项目的背景是钢铁行业的…

uniapp使用u-search以及相关api

u-search是uni-app框架中的一款搜索组件&#xff0c;可以方便地实现搜索功能。下面简单介绍一下如何使用u-search以及相关API。 引入u-search组件 在需要使用u-search组件的页面中&#xff0c;首先需要引入它&#xff1a; <template><view><u-search></…

SAP UI5 walkthrough step6 Modules

在SAPUI5 中&#xff0c;资源通常用作Modules&#xff0c;这个我们将用Message Toast 来实现告警功能 修改controller.js webapp/controller/App.controller.js sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast" ], (Controller, Mes…