zoukankan      html  css  js  c++  java
  • 策略模式 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();
    }

  • 相关阅读:
    flash做的按扭突然在页面上获取不到焦点之后
    收集 关于js的接口和 继承实现的代码例子
    从我丢失了;号 之后说开来去
    你真的会写JavaScript吗?
    json.js + jquery 在 ie7下 的 bug
    如何减少浏览器的repaint和reflow? [转]
    2012我们需要什么样的前的工程师
    JavaScript是否可实现多线程 — 深入理解JavaScript定时机制
    是时候了,我们需要前端架构师
    JS事件模型小结
  • 原文地址:https://www.cnblogs.com/vectorli/p/4495357.html
Copyright © 2011-2022 走看看