设计模式:策略模式(C++实现)

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每个算法封装成独立的对象,使得它们可以互相替换。下面是一个使用C++实现策略模式的示例:

cpp 复制代码
#include <iostream>

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

// 具体策略类1
class ConcreteStrategy1 : public Strategy
{
public:
    void execute() override
    {
        std::cout << "Executing Concrete Strategy 1" << std::endl;
    }
};

// 具体策略类2
class ConcreteStrategy2 : public Strategy
{
public:
    void execute() override
    {
        std::cout << "Executing Concrete Strategy 2" << std::endl;
    }
};

// 上下文类
class Context
{
private:
    Strategy *strategy;

public:
    Context(Strategy *strategy) : strategy(strategy) {}
    void setStrategy(Strategy *strategy)
    {
        this->strategy = strategy;
    }
    void executeStrategy()
    {
        strategy->execute();
    }
};

int main()
{
    Strategy *strategy1 = new ConcreteStrategy1();
    Strategy *strategy2 = new ConcreteStrategy2();
    Context context(strategy1);
    context.executeStrategy(); // 输出 "Executing Concrete Strategy 1"
    context.setStrategy(strategy2);
    context.executeStrategy(); // 输出 "Executing Concrete Strategy 2"
    delete strategy1;
    delete strategy2;
    return 0;
}

运行结果:

bash 复制代码
Executing Concrete Strategy 1
Executing Concrete Strategy 2

在上述示例中,我们首先定义了一个抽象策略类 Strategy,其中包含一个纯虚函数 execute()。然后,我们创建了两个具体策略类 ConcreteStrategy1 和 ConcreteStrategy2,它们分别实现了 execute() 函数。

接下来,我们定义了上下文类 Context,其中包含一个私有成员 strategy,用于保存当前的策略对象。Context 类中的 setStrategy() 函数用于设置当前策略,executeStrategy() 函数用于调用当前策略的 execute() 函数。

在 main() 函数中,我们首先创建了两个具体策略对象 strategy1 和 strategy2,然后创建了一个 Context 对象 context,并将 strategy1 设置为当前策略,最后调用 executeStrategy() 函数,输出的是 "Executing Concrete Strategy 1"。接着,我们将 strategy2 设置为当前策略,并再次调用 executeStrategy() 函数,输出的是 "Executing Concrete Strategy 2"。

这样,我们就实现了一个简单的策略模式。通过将算法封装成具体策略对象,并在上下文类中动态设置当前策略,我们可以根据需要切换不同的算法实现。这种方式使得算法的变化独立于使用算法的客户端,提高了代码的灵活性和可维护性。

相关推荐
布莱克6052 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光9 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记9 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw10 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
拆房老料11 小时前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
繁星蓝雨11 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
AlanAshley11 小时前
四种镜像文件在各操作系统的使用用法及区别
策略模式·虚拟机
旖旎夜光12 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习