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

  • 相关阅读:
    BZOJ1858[Scoi2010]序列操作 题解
    BZOJ3631[JLOI2014]松鼠的新家 题解
    BZOJ1036[ZJOI2008]树的统计Count 题解
    BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
    BZOJ3212 Pku3468 A Simple Problem with Integers 题解
    BZOJ1012[JSOI2008]最大数maxnumber 题解
    洛谷P1080 国王游戏
    洛谷 P2296 寻找道路
    洛谷P1970 花匠
    洛谷 P1969 积木大赛
  • 原文地址:https://www.cnblogs.com/vectorli/p/4495357.html
Copyright © 2020-2023  润新知