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

 

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。