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

设计模式之策略模式学习

1.介绍

策略模式(Strategy Pattern)是一种行为型设计模式,用于在运行时选择算法的行为。它将一组可互换的算法封装在独立的类中,使它们可以相互替换,避免使用大量的条件语句。

🧱 结构组成

  1. Strategy(策略接口):定义所有支持的算法的公共接口。

  2. ConcreteStrategy(具体策略):实现策略接口的不同算法。

  3. Context(上下文):维护一个对策略对象的引用,最终由它调用策略对象的方法。

2.例子

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>// 策略接口
class SortStrategy {
public:virtual void sort(std::vector<int>& data) = 0;virtual ~SortStrategy() = default;
};// 具体策略:升序排序
class AscendingSort : public SortStrategy {
public:void sort(std::vector<int>& data) override {std::sort(data.begin(), data.end());}
};// 具体策略:降序排序
class DescendingSort : public SortStrategy {
public:void sort(std::vector<int>& data) override {std::sort(data.begin(), data.end(), std::greater<int>());}
};// 上下文:持有一个策略对象
class Context {
private:std::unique_ptr<SortStrategy> strategy;public:void setStrategy(std::unique_ptr<SortStrategy> s) {strategy = std::move(s);}void doSort(std::vector<int>& data) {if (strategy) {strategy->sort(data);} else {std::cerr << "No strategy set!" << std::endl;}}
};// 测试代码
int main() {Context context;std::vector<int> data = {5, 2, 8, 1, 3};std::cout << "Original: ";for (int i : data) std::cout << i << " ";std::cout << "\n";// 使用升序排序context.setStrategy(std::make_unique<AscendingSort>());context.doSort(data);std::cout << "Ascending: ";for (int i : data) std::cout << i << " ";std::cout << "\n";// 使用降序排序context.setStrategy(std::make_unique<DescendingSort>());context.doSort(data);std::cout << "Descending: ";for (int i : data) std::cout << i << " ";std::cout << "\n";return 0;
}

类图关系:

继承、组合。

http://www.dtcms.com/a/430655.html

相关文章:

  • 自己做的网站外国人能访问吗广告设计公司有哪些渠道通路
  • 分布式专题——24 Kafka功能扩展
  • 范式革命:RDMA 如何让网络成为 “分布式内存总线”
  • 如何弄公司网站青岛专业网站制作
  • Langchain4j笔记
  • 云计算介绍
  • 什么是Redis哨兵机制?
  • Web本体语言(OWL)
  • 快学快用系列:一文学会java后端WebApi开发
  • 网站加速器免费永久网站开发学习课程
  • SpringBoot 整合Jasypt 实现配置文件加密读取操作详解
  • apache 服务器如何使用
  • CI/CD 流水线与 agentic AI:如何创建自我纠正的 monorepos
  • Coze源码分析-资源库-编辑工作流-后端源码-IDL/API/应用服务层
  • 网站建设与维护课程设计报告书wordpress 多媒体管理系统
  • 一文了解国产算子编程语言 TileLang,TileLang 对国产开源生态的影响与启示
  • C#和Java正则表达式开发
  • 从零开始:MCP数据库助手(一)- 基础搭建
  • ORB_SLAM2原理及代码解析:SetPose() 函数
  • 蚌埠市建设学校网站网站排名权重怎么做
  • Android android.util.LruCache源码阅读
  • 安卓基础组件020-页面跳转传递数据001
  • Postman 学习笔记 IV:Workflow、Newman 与 Mock Server 实战技巧
  • 安卓基础组件016--第三方Toasty组件
  • ESNP LAB 笔记:配置静态BFD检测MPLS LDP LSP
  • Day30 | Java集合框架之Collections工具类
  • 【STM32项目开源】基于STM32的智能养殖场环境监测系统
  • 【Java并发】揭秘Lock体系 -- condition等待通知机制
  • 计算机网络-网络边缘网络核心
  • 安卓13_ROM修改定制化-----修改固件 去除主题防止恢复 破解主题等操作解析