设计模式——策略模式(c++)

devtools/2024/11/16 12:59:10/

策略模式(Strategy Pattern)在 C++ 中的实现

1. 策略模式定义

策略模式定义了一系列算法(策略类),将每个算法封装起来,使它们可以相互替换,达到灵活使用不同策略的目的。在策略模式中,算法被封装成一系列具体策略类,作为抽象策略类的子类。根据实际需要选择合适的策略类来使用。

2. 策略模式角色

  • Context(环境类):持有对抽象策略类的引用,这里指 Fighter 类。
  • Strategy(抽象策略类):定义所支持的算法的公共接口,是所有具体策略类的父类,这里指 ItemStrategy 类。
  • ConcreteStrategy(具体策略类):实现抽象策略类中声明的接口的子类,这里包括 ItemStrategy_BxdItemStrategy_DhdItemStrategy_Shd

3. 策略模式优缺点

优点

  • 以扩展的方式支持未来的变化,符合开闭原则。
  • 能有效替代大量不稳定的 ifswitch 条件分支。
  • 提高算法的复用性。
  • 改变环境对象的行为通过设置不同的策略类来实现。

缺点

  • 可能导致引入许多新策略类。
  • 使用策略时,调用者必须了解所有策略的功能,并选择合适的策略。

4. C++ 示例代码

以下是使用策略模式的 C++ 示例代码:

#include <iostream>
#include <memory>
using namespace std;// 前向声明
class Fighter;// 策略基类
class ItemStrategy {
public:virtual void UseItem(Fighter* fighter) = 0; // 使用道具的纯虚函数virtual ~ItemStrategy() {} // 虚析构函数
};// 战士类
class Fighter {
public:Fighter(int life, int magic, int attack): life(life), magic(magic), attack(attack), itemStrategy(nullptr) {}void SetItemStrategy(ItemStrategy* strategy) {itemStrategy = strategy; // 设置当前的道具策略}void UseItem() {if (itemStrategy) {itemStrategy->UseItem(this); // 使用当前的道具策略}}int GetLife() const {return life; // 获取生命值}void SetLife(int life) {this->life = life; // 设置新的生命值}virtual ~Fighter() {} // 虚析构函数protected:int life;   // 生命值int magic;  // 魔法值int attack; // 攻击力ItemStrategy* itemStrategy; // 当前使用的道具策略
};// 补血丹策略类
class ItemStrategy_Bxd : public ItemStrategy {
public:virtual void UseItem(Fighter* fighter) override {fighter->SetLife(fighter->GetLife() + 200); // 补充生命值}
};// 大还丹策略类
class ItemStrategy_Dhd : public ItemStrategy {
public:virtual void UseItem(Fighter* fighter) override {fighter->SetLife(fighter->GetLife() + 300); // 补充生命值}
};// 守护丹策略类
class ItemStrategy_Shd : public ItemStrategy {
public:virtual void UseItem(Fighter* fighter) override {fighter->SetLife(fighter->GetLife() + 500); // 补充生命值}
};// 战士类
class F_Warrior : public Fighter {
public:F_Warrior(int life, int magic, int attack) : Fighter(life, magic, attack) {}
};// 法师类
class F_Mage : public Fighter {
public:F_Mage(int life, int magic, int attack) : Fighter(life, magic, attack) {}
};int main() {// 创建一个战士角色Fighter* role_var = new F_Warrior(1000, 0, 200);cout << "初始生命值: " << role_var->GetLife() << endl;// 使用补血丹策略ItemStrategy* strategy = new ItemStrategy_Bxd();role_var->SetItemStrategy(strategy);role_var->UseItem();// 使用大还丹策略ItemStrategy* strategy2 = new ItemStrategy_Dhd();role_var->SetItemStrategy(strategy2);role_var->UseItem();// 输出最终生命值cout << "使用补血丹和大还丹后的生命值: " << role_var->GetLife() << endl;// 释放内存delete strategy;      // 释放补血丹策略对象delete strategy2;     // 释放大还丹策略对象delete role_var;      // 释放角色对象return 0;
}

5. 总结

策略模式是一种灵活的设计模式,可以帮助我们在不改变环境类的情况下,轻松地替换和添加新的策略。通过合理运用策略模式,可以有效地提升代码的可维护性和可扩展性。


http://www.ppmy.cn/devtools/134441.html

相关文章

木舟0基础学习Java的第三十三天(OA企业管理系统)

贯穿项目&#xff1a;OA企业管理系统 框架技术&#xff1a; Springboot / Spring / SpringMVC / MyBatis / Shiro 项目构建管理&#xff1a; maven 数据库&#xff1a; mysql 前端技术&#xff1a; html / css / js / jquery / jsp 扩展技术&#xff…

活动|华院计算作为联盟理事单位出席进博会全球人工智能合作论坛

第七届中国国际进口博览会&#xff08;进博会&#xff09;于11月5日至10日在上海举行&#xff0c;作为本次进博会的重要配套活动&#xff0c;首届人工智能全球合作论坛也于9日圆满落幕。本次论坛由全球招商中心委员会、人工智能全球合作论坛组委会主办&#xff0c;中国国际科技…

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…

第二十章 TCP 客户端 服务器通信 - 立即发送模式(Q 模式)

文章目录 第二十章 TCP 客户端 服务器通信 - 立即发送模式&#xff08;Q 模式&#xff09;立即发送模式&#xff08;Q 模式&#xff09;流模式(S模式)缓冲区大小 服务器端OPEN命令 第二十章 TCP 客户端 服务器通信 - 立即发送模式&#xff08;Q 模式&#xff09; 立即发送模式…

零基础上手WebGIS+智慧校园实例(1)【html by js】

请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 等下再更新一下1. WebGIS矢量图形的绘制&#xff08;超级详细&#xff01;&#xff01;&#xff09;&#xff0c;2. WebGIS计算距离&#xff0c; 以及智慧校园实例 with 3个例子&#xff01;&#xff01;…

ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书

目录 一、引言 二、准备工作 三、申请 SSL 证书 四、证书选型 五、ssl重要性 一、引言 目前免费 Lets Encrypt、ZeroSSL、BuyPass、Google Public CA SSL 证书&#xff0c;一般免费3-6个月。从申请难易程度分析&#xff0c;zerossl申请相对快速和简单&#xff0c;亲测速度非…

PyTorch——从入门到精通:PyTorch简介与安装(最新版)【PyTorch系统学习】

前言 在这个由数据驱动的时代&#xff0c;深度学习已经成为了推动技术进步的核心力量。而PyTorch&#xff0c;作为当今最流行的深度学习框架之一&#xff0c;以其动态计算图、易用性和灵活性&#xff0c;受到了全球开发者和研究者的青睐。为了帮助更多的学习者和开发者掌握这一…

C#入门 023 什么是类(Class)

什么是“类” 是一种数据结构 是一种数据类型 代表现实世界中的“种类” 构造器和析构器 析构器 析构器&#xff08;Destructor&#xff09;是一种特殊的成员方法&#xff0c;用于在对象被垃圾回收器&#xff08;Garbage Collector, GC&#xff09;回收之前执行清理操作。…