主页 > 电脑硬件  > 

C++设计模式-策略模式

C++设计模式-策略模式
一:概述

        策略模式是一种行为设计模式,来源于《设计模式:可复用面向对象软件的基础》一书。它定义了一组算法,并将它们封装成独立的对象。策略模式在标准模板库(STL)中被广泛使用。

二:策略模式的设计实现

      目的             定义一组算法,并将它们封装成对象。

      别名             策略(Policy)

      使用场景

          1)需要多种不同版本的算法。

          2)客户端不需要了解具体的算法实现。

         3)需要在程序运行时能够切换算法。

        

1. 策略(Strategy)

       为一组算法定义接口。

2. 具体策略(ConcreteStrategy)

       实现某个具体的算法。

3. 上下文(Context)

      维护对具体策略(ConcreteStrategy)的引用。

      持有一个具体策略(ConcreteStrategy)。

上下文(Context)持有一个封装在对象中的具体策略(ConcreteStrategy)。具体策略实现了策略(Strategy)接口。通常,具体策略可以在程序运行时进行调整。

#include <iostream> #include <memory> #include <utility> // 抽象策略类,定义策略接口 class Strategy { public: virtual void execute() = 0; // (4) 纯虚函数,具体策略类需要实现此方法 virtual ~Strategy() {} // 虚析构函数,保证子类正确析构 }; // 上下文类,负责管理和执行策略 class Context { std::unique_ptr<Strategy> strat{}; // (1) 使用智能指针管理策略对象,确保资源自动释放 public: void setStrategy(std::unique_ptr<Strategy> strat_) { // (2) 设置策略,使用 std::move 进行所有权转移 strat = std::move(strat_); } void strategy() { // (3) 执行当前策略(如果存在) if (strat) strat->execute(); } }; // 具体策略1,实现 execute 方法 class Strategy1 : public Strategy { public: void execute() override { // override 关键字确保正确重写基类方法 std::cout << "Strategy1 executed\n"; } }; // 具体策略2,实现 execute 方法 class Strategy2 : public Strategy { public: void execute() override { std::cout << "Strategy2 executed\n"; } }; // 具体策略3,实现 execute 方法 class Strategy3 : public Strategy { public: void execute() override { std::cout << "Strategy3 executed\n"; } }; int main() { std::cout << '\n'; Context k; // 创建上下文对象 // 设置并执行策略1 k.setStrategy(std::make_unique<Strategy1>()); k.strategy(); // 设置并执行策略2 k.setStrategy(std::make_unique<Strategy2>()); k.strategy(); // 设置并执行策略3 k.setStrategy(std::make_unique<Strategy3>()); k.strategy(); std::cout << '\n'; return 0; } 三:策略模式在C++标准库中的应用  template<class T, class Allocator = std::allocator<T>> // (1) class vector; template<class Key, class T, class Hash = std::hash<Key>, // (3) class KeyEqual = std::equal_to<Key>, // (4) class allocator = std::allocator<std::pair<const Key, T>> // (2) class unordered_map;

      策略模式在 STL 中被广泛应用,主要用于允许用户自定义算法或策略,以适应不同的需求。例如,STL 容器 std::vector 和 std::unordered_map 使用 模板参数 作为策略对象,提供了灵活的内存管理、哈希计算等策略的自定义能力。

策略模式的体现:

哈希函数可替换:如果默认的 std::hash<Key> 不能满足需求(如哈希冲突太多),可以提供自定义哈希函数。键比较策略可替换:如果键的比较方式需要修改(如忽略大小写),可以自定义 KeyEqual。内存分配策略可替换:默认的 std::allocator 可以替换为其他自定义分配器。 四:策略模式的优缺点

   优点

算法被封装成对象,并且可以在运行时进行替换。添加新的策略非常容易,只需实现一个新的策略类即可。策略模式可以替代基于 if/else 或 switch 语句的条件执行,提高代码的可维护性和扩展性。在 C++ 中,可调用对象(Callables)通常是策略的轻量级实现。

  缺点

客户端必须了解并选择合适的策略。可能会导致对象(策略)数量急剧增加。
标签:

C++设计模式-策略模式由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++设计模式-策略模式