设计模式之策略模式学习

1.介绍

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

🧱 结构组成

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

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

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

2.例子

cpp 复制代码
#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;
}

类图关系:

继承、组合。

相关推荐
好奇龙猫15 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
saoys15 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
电子小白12316 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
xiaolyuh12316 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
唯情于酒16 小时前
Docker学习
学习·docker·容器
charlie11451419118 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
IT=>小脑虎18 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
#眼镜&18 小时前
嵌入式学习之路2
学习
码农小韩19 小时前
基于Linux的C++学习——指针
linux·开发语言·c++·学习·算法
微露清风19 小时前
系统性学习C++-第十九讲-unordered_map 和 unordered_set 的使用
开发语言·c++·学习