设计模式之策略模式学习

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

类图关系:

继承、组合。

相关推荐
sunshine22 girl23 分钟前
Java学习三 高级语法3, 方法
java·学习
传奇开心果编程1 小时前
【dioxus0.7基础语法学与练】第8课:RSX 宏 — Dioxus 声明式 UI 语法
开发语言·学习·rust
一条破秋裤1 小时前
24_MPU6050结构参数与寄存器基础
stm32·嵌入式硬件·学习
诗词在线2 小时前
江上渔者|原文+注释+译文+赏析+考点
学习
逆境不可逃3 小时前
Pi Agent 学习笔记:不同模型如何接入同一套工具循环
笔记·学习
词却3 小时前
OpenCV学习:dlib 人脸检测
人工智能·opencv·学习
爱吃苹果的日记本3 小时前
数据结构第三课补充(空间复杂度)
数据结构·学习
PC2005-cloud3 小时前
Rust学习笔记:所有权、借用与生命周期——Rust的核心机制
笔记·学习·rust
霍金的微笑4 小时前
fuccc
学习
潜心一志4 小时前
HALCON软件——数据结构
学习·计算机视觉