设计模式之策略模式学习

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

类图关系:

继承、组合。

相关推荐
●VON27 分钟前
React Native for OpenHarmony:2048 小游戏的开发与跨平台适配实践
javascript·学习·react native·react.js·von
ZH154558913136 分钟前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
xcLeigh1 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh1 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
GHL2842710901 小时前
分析式AI学习
人工智能·学习·ai编程
lpruoyu2 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
野犬寒鸦2 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][mmc][mmc_sdio]
linux·笔记·学习
果果燕2 小时前
今日学习笔记:双向链表、循环链表、栈
笔记·学习·链表
觉醒大王2 小时前
AI写的青基中了
人工智能·笔记·深度学习·学习·职场和发展·学习方法