策略模式(C++)

1. 介绍

目的: 定义一系列的算法(行为),把它们一个个封装起来,并且使它们可以互替换(继承接口).

关键: 实现同一个接口.

优点:

  • 算法之间可以互相替换;
  • 可以避免多重条件判断;
  • 扩展性良好.

缺点:

  • 策略类会比较多;
  • 所有策略都需要对外暴露.

使用场景:

  1. 一个对象可能存在多种行为,需要使用多重条件判断时;
  2. 系统需要在几种算法中选择一种.

2. UML图

image

3. 案例

#include <iostream>
#include <memory>

//接口类
class Strategy{
public:
    virtual int doOperate(const int a, const int b) = 0;
};

//算法实现1
class StrategyAdd : public Strategy{
public:
    int doOperate(const int a, const int b) override {
        return a+b;
    }
};

//算法实2
class StrategySub : public Strategy{
public:
    int doOperate(const int a, const int b) override {
        return a-b;
    }
};

//条件选择
class Context {
 public:
    Context(std::shared_ptr<Strategy> Strategy) : Strategy_(Strategy){}

    std::shared_ptr<Strategy> GetStrategy() {
        return Strategy_;
    }

    void SetStrategy(std::shared_ptr<Strategy> Strategy) {
        Strategy_ = Strategy;
    }

    int doOperate(const int a, const int b) {
        return Strategy_->doOperate(a, b);
    }

 private:
    std::shared_ptr<Strategy> Strategy_;
};

int main() {
    Context context(std::make_shared<StrategyAdd>());
    std::cout << context.doOperate(10, 100) << std::endl;

    context.SetStrategy(std::make_shared<StrategySub>());
    std::cout << context.doOperate(10, 100) << std::endl;
    return 0;
}

输出结果:

110
-90

其他

策略模式初看和工厂模式其实是有点像的,但是细看其实区别很大:

  • 工厂模式是创建型模式,它的作用就是创建对象;策略模式是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
  • 工厂模式关注对象创建,实际创建对象是被封装的,用户不可见;而策略模式更多是关注行为的替换,创建对象其实是对用户可见的.

当然也不要盲目追求设计模式,在行为类型并不多时,直接使用条件判断更加合理.

原文链接: https://www.cnblogs.com/xl2432/p/13129750.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    策略模式(C++)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/355222

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午9:06
下一篇 2023年3月2日 上午9:06

相关推荐