当前位置: 首页 > news >正文

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

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

#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;
}

运行结果:

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

http://www.lryc.cn/news/173190.html

相关文章:

  • 网络安全深入学习第二课——热门框架漏洞(RCE—Thinkphp5.0.23 代码执行)
  • Pdf文件签名检查
  • web前端之float布局与flex布局
  • expected ‘,’ after expression in R【R错误】
  • 算法|图论 2
  • 使用C#实现服务端与客户端的简陋聊天
  • 生成式模型和判别式模型区别
  • 【kafka实战】03 SpringBoot使用kafka生产者和消费者示例
  • Only file and data URLs are supported by the default ESM loader
  • LeetCode01
  • 计算机网络高频面试题集锦
  • Linux启动过程详解 Xmind导图笔记
  • Qt5开发及实例V2.0-第十七章-Qt版MyWord字处理软件
  • 机器视觉工程师们,常回家看看
  • 网络隔离下实现的文件传输,现有的方式真的安全吗?
  • [医学图像知识]CT图和PET图的成像表现形式
  • 聊聊wireshark的进阶使用功能 | 京东云技术团队
  • 小米手机安装面具教程(Xiaomi手机获取root权限)
  • DSU ON TREE
  • Java“对象”
  • vuepress+gitee免费搭建个人在线博客(无保留版)
  • Android 12.0 系统限制上网系列之iptables用IOemNetd实现app上网白名单的功能实现
  • Idea和DataGrip自定义常用代码模板,熟练使用快捷模板可促进开发效率
  • Vue.js :实现嵌套对话框的查看按钮
  • 9.2.4 【MySQL】段的结构
  • 怎么快速提取图片中的文字信息?怎么使用OCR图片文字提取一键提取文字
  • Selenium隐藏浏览器特征
  • Linux下的buff/cache
  • 3.wifi开发,网络编程
  • Android框架mqtt库无法兼容高版本android13的问题