策略模式简单介绍

什么是策略模式?一般用于什么场景?

策略模式一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们可以相互替换,这样,客户端可以根据需要在运行时选择合适的算法,而不需要更改原有的代码。

很多时候,代码中有大量中有大量的if else,Switch等,可以通过使用策略模式,避免大量条件语句使用,实现算法的分离和独立变化。

代码示例:

cpp 复制代码
//策略模式
#include <iostream>
#include <memory>//引入智能指针头文件

// 策略接口,定义了执行策略的方法
class Strategy {
public:
    virtual void execute() const = 0; // execute()是纯虚函数,没有实现,要求子类必须实现这个函数
    // 纯虚函数是没有实现的虚函数,子类必须实现这个函数,否则子类也会变成抽象类
    virtual ~Strategy() = default; // 虚析构函数,确保子类的析构函数被调用
    // 虚析构函数是为了确保在删除子类对象时,能够正确调用子类的析构函数,从而避免内存泄漏
};

// 具体策略A
class ConcreteStrategyA : public Strategy {// 继承策略接口
    // 实现策略接口的方法
public:
    void execute() const override {
        std::cout << "Executing Strategy A" << std::endl;
    }
};

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

// 上下文类
class Context { // 上下文类是策略模式的核心类,负责管理策略对象的生命周期和执行策略的方法,生命周期由智能指针管理
private:
    std::unique_ptr<Strategy> strategy; // 使用智能指针来管理策略对象的生命周期,避免手动内存管理的麻烦
    // unique_ptr是C++11引入的智能指针,表示独占所有权的指针,不能被复制,只能被移动,避免了内存泄漏的问题
    // unique_ptr的构造函数是私有的,不能直接创建对象,只能通过std::make_unique来创建对象,对象类型是Strategy的子类
    //strategy是一个指向策略接口的智能指针,表示当前上下文使用的策略对象,此时strategy是一个空指针,表示没有策略对象被设置
    //为什么设置为私有?因为上下文类不应该直接访问策略对象的实现细节,只能通过策略接口来调用策略对象的方法
    // 这样可以实现策略模式的开放封闭原则,允许在不修改上下文类的情况下,添加新的策略对象,如策略A和策略B
public:
    void setStrategy(std::unique_ptr<Strategy> newStrategy) {//newStrategy是一个智能指针,表示新的策略对象
        strategy = std::move(newStrategy); // 使用std::move将newStrategy的所有权转移给strategy,避免重复创建对象
    }

    void executeStrategy() const {// 执行策略的方法,调用当前策略对象的execute()方法
        // const修饰符表示这个方法不会修改类的成员变量,保证了方法的安全性
        if (strategy) {//判断策略对象是否为空
            // 如果不为空,则调用策略对象的方法
            strategy->execute();
        } else {
            std::cout << "No strategy set" << std::endl;
        }
    }
};

// 客户端
int main() {
    Context context; // 创建上下文对象,上下文类是策略模式的核心类,负责管理策略对象的生命周期和执行策略的方法

    context.setStrategy(std::make_unique<ConcreteStrategyA>());//make_unique是C++11引入的函数模板,用于创建智能指针对象,避免手动内存管理的麻烦
    // make_unique的参数是一个策略对象的构造函数,表示创建一个新的策略对象,并将其所有权转移给上下文对象
    context.executeStrategy(); // Output: Executing Strategy A

    context.setStrategy(std::make_unique<ConcreteStrategyB>());
    context.executeStrategy(); // Output: Executing Strategy B
    system("pause");
    // 这里使用了智能指针来管理策略对象的生命周期,避免了手动内存管理的麻烦。
    return 0;
}
相关推荐
不爱吃萝卜的嘤嘤怪2 小时前
如何删除vscod远程连接的服务器
运维·服务器·策略模式
ValidationExpression18 小时前
设计模式-策略模式
python·设计模式·策略模式
文件夹__iOS3 天前
状态模式 VS 策略模式
状态模式·策略模式
深海小咸鱼4 天前
如何在服务器后台运行Python脚本,并配置虚拟环境与GPU支持
服务器·python·策略模式
钢铁男儿5 天前
Python 装饰器优化策略模式:电商促销折扣的优雅解法
开发语言·python·策略模式
用手码出世界5 天前
【Linux】日志与策略模式、线程池
linux·运维·服务器·开发语言·c++·策略模式
高效匠人7 天前
Python10天冲刺-设计模型之策略模式
开发语言·人工智能·python·策略模式
王五周八8 天前
基于策略模式实现灵活可扩展的短信服务架构
架构·策略模式
林深时见禄9 天前
策略模式:灵活的算法封装与切换
设计模式·策略模式
XiaoCCCcCCccCcccC9 天前
Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
linux·c语言·c++·安全·单例模式·策略模式