• 策略模式(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
    

    其他

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

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

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

  • 相关阅读:
    hello fetch
    git 基础命令
    拜占庭将军
    如何学习区块链
    简单的理解区块链技术
    使用AOP统一验签和校参
    为每个请求分配traceId的两种方式及父子线程本地变量传递
    监听kafka消息
    JVM OOM分析与调优
    JVM内存结构
  • 原文地址:https://www.cnblogs.com/xl2432/p/13129750.html
Copyright © 2020-2023  润新知