策略模式简单介绍

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

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

很多时候,代码中有大量中有大量的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;
}
相关推荐
南玖yy3 天前
x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
开发语言·汇编·arm开发·后端·架构·策略模式
张伯毅4 天前
Flink 失败重试策略 :restart-strategy.type
大数据·flink·策略模式
magic 2456 天前
Java设计模式详解:策略模式(Strategy Pattern)
java·设计模式·策略模式
熬夜苦读学习6 天前
日志与策略模式
linux·运维·开发语言·后端·策略模式
王翼鹏7 天前
Spring boot 策略模式
java·spring boot·策略模式
向哆哆7 天前
Java中的设计模式实战:单例、工厂、策略模式的最佳实践
java·设计模式·策略模式
QQ_hoverer8 天前
抽象工厂模式与策略模式结合使用小案例
抽象工厂模式·策略模式
哈哈哈哈哈哈哈哈哈...........8 天前
【设计模式】策略模式
设计模式·策略模式
QQ_hoverer9 天前
Java设计模式之工厂模式与策略模式简单案例学习
java·开发语言·学习·设计模式·策略模式
梵高的代码色盘9 天前
工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
设计模式·策略模式