设计模式之策略模式学习

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

类图关系:

继承、组合。

相关推荐
电子云与长程纠缠1 天前
Godot学习03 - 实例化、层级访问、Export
android·学习·godot
青桔柠薯片1 天前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
今儿敲了吗1 天前
python基础学习笔记第六章——函数进阶
笔记·python·学习
2501_918126911 天前
学习所有6502写游戏动画的语句
汇编·嵌入式硬件·学习·程序人生·游戏
-Springer-1 天前
STM32 学习 —— 个人学习笔记9-3(FlyMcu 串口下载)
笔记·stm32·学习
weixin_458872611 天前
东华复试OJ每日3题打卡·复盘103~105
学习
SuniaWang1 天前
《Spring AI + 大模型全栈实战》学习手册系列 ·专题三:《Embedding 模型选型指南:从 MMTEB 排名到实际应用》
人工智能·学习·spring
问道飞鱼1 天前
【Tauri框架学习】Windows 11 环境下 Tauri 开发环境安装与问题解决手册
windows·学习·tauri·开发环境
لا معنى له1 天前
什么是Active Inference(主动推理)? ——学习笔记
笔记·学习
JicasdC123asd1 天前
并行双分支瓶颈架构改进YOLOv26异构卷积核协同特征提取与残差学习双重突破
学习·yolo·架构