• 策略模式 C++实现


    策略(Strategy)模式

    Strategy pattern in LePUS3 (legend)     策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,比如每个人都要“交个人所得税”,但是“在美国交个人所 得税”和“在中国交个人所得税”就有不同的算税方法。策略模式让算法独立于使用它的客户而独立变化。

    其主要实现方法就是将某些某些功能属性从目标对象中解耦出来构成单独的功能对象,目标对象可以根据需求组合不同的功能对象。下面示例将鸭子的飞行和呱呱叫功能从鸭子中解耦出来,使用组合而不是继承来实现。鸭子的子类在继承鸭子的时候可以根据需求自由的选择飞行和呱呱叫的实现类。

    #include <memory>
    
    class FlyBehaviour;
    class QuackBehavior;
    
    class Duck
    {
    public:
        Duck();
        ~Duck();
    
        virtual void display() = 0;
    
        void setFlyBehaviour(std::shared_ptr<FlyBehaviour>& behavior);
        void setQuackBehavior(std::shared_ptr<QuackBehavior>& behavior);
        void performFlyBehaviour();
        void performQuackBehavior();
    
    
    protected:
        std::shared_ptr<FlyBehaviour> m_flyBehavior;
        std::shared_ptr<QuackBehavior> m_quackBehavior;
    };
    #include "FlyBehaviour.h"
    #include "QuackBehavior.h"
    
    Duck::Duck()
    {
    }
    
    Duck::~Duck()
    {
    }
    
    void Duck::setFlyBehaviour(std::shared_ptr<FlyBehaviour>& behavior)
    {
        m_flyBehavior = behavior;
    }
    
    void Duck::setQuackBehavior(std::shared_ptr<QuackBehavior>& behavior)
    {
        m_quackBehavior = behavior;
    }
    
    void Duck::performFlyBehaviour()
    {
        m_flyBehavior->fly();
    }
    
    void Duck::performQuackBehavior()
    {
        m_quackBehavior->quack();
    }
    class FlyBehaviour
    {
    public:
        FlyBehaviour();
        ~FlyBehaviour();
    
        virtual void fly() = 0;
    };
    #include "FlyBehaviour.h"
    
    class FlyWithWings : public FlyBehaviour
    {
    public:
        FlyWithWings();
        ~FlyWithWings();
    
        virtual void fly();
    };
    FlyWithWings::FlyWithWings()
    {
    
    }
    
    FlyWithWings::~FlyWithWings()
    {
    
    }
    
    void FlyWithWings::fly()
    {
        std::cout << "I can fly with wings" << std::endl;
    }
    #include "Duck.h"
    
    class RedDuck : public Duck
    {
    public:
        RedDuck();
        ~RedDuck();
    
        void display();
    };
    #include "RedDuck.h"
    #include <iostream>
    #include "FlyWithWings.h"
    #include "Squeak.h"
    
    RedDuck::RedDuck()
    {
        std::shared_ptr<FlyBehaviour> flyB(new FlyWithWings());
        std::cout << "behavior counter " << flyB.use_count() << std::endl;
        setFlyBehaviour(flyB);
        std::cout << "behavior counter " << flyB.use_count() << std::endl;
        std::shared_ptr<QuackBehavior> quackB(new Squeak());
        setQuackBehavior(quackB);
    }
    
    RedDuck::~RedDuck()
    {
    
    }
    
    void RedDuck::display()
    {
        std::cout << "I am a red duck!" << std::endl;
        performFlyBehaviour();
        performQuackBehavior();
    }

  • 相关阅读:
    Spring AOP日志实现(一)
    ArrayList和LinkedList的区别
    webmagic保存数据
    Java静态代码块、构造代码块执行顺序问题
    为Spring Cloud Ribbon配置请求重试(Camden.SR2+)
    centos关机与重启命令
    解决win环境下访问本机虚拟机中centos7 ftp服务器的问题
    【MongoDB异常】Exception authenticating MongoCredential解决方法
    mongodb解决只能本地连接不能远程连接问题
    Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法
  • 原文地址:https://www.cnblogs.com/vectorli/p/4495357.html
Copyright © 2020-2023  润新知