Strategy模式C++实现

说明:将《Head First设计模式》中策略模式,用C++来实现。

 

飞翔行为FlyBehavior.h:

#pragma once
#include <iostream>
using namespace std;

class IFlyBehavior
{
public:
    virtual ~IFlyBehavior(){}

    virtual void Fly() = 0;
};

class CFlyWithWings : public IFlyBehavior
{
public:
    void Fly()
    {
        cout<<"I'm flying"<<endl;
    }
};

class CFlyNoWay : public IFlyBehavior
{
public:
    void Fly()
    {
        cout<<"I can't fly"<<endl;
    }
};

class CFlyRocketPowered : public IFlyBehavior
{
public:
    void Fly()
    {
        cout<<"I'm flying with a rocket!"<<endl;
    }
};

 

鸣叫行为QuackBehavior.h:

#pragma once
#include <iostream>
using namespace std;

class IQuackBehavior
{
public:
    virtual ~IQuackBehavior(){}

    virtual void Quack() = 0;
};

class CQuack : public IQuackBehavior
{
public:
    void Quack()
    {
        cout<<"Quack"<<endl;
    }
};

class CMuteQuack : public IQuackBehavior
{
public:
    void Quack()
    {
        cout<<"Silence"<<endl;
    }
};

class CSqueak : public IQuackBehavior
{
public:
    void Quack()
    {
        cout<<"Squeak"<<endl;
    }
};

 

鸭子类:

#pragma once
#include "FlyBehavior.h"
#include "QuackBehavior.h"

class CDuck
{
public:
    CDuck()
        : m_pFly(NULL)
        , m_pQuack(NULL)
    {

    }

    virtual ~CDuck(){}

    virtual void Display() = 0;

    void SetFlyBehavior(IFlyBehavior* pFly)
    {
        m_pFly = pFly;
    }

    void SetQuackBehavior(IQuackBehavior* pQuack)
    {
        m_pQuack = pQuack;
    }

    void PerformFly()
    {
        if (NULL == m_pFly)
        {
            return;
        }

        m_pFly->Fly();
    }

    void PerformQuack()
    {
        if (NULL == m_pQuack)
        {
            return;
        }

        m_pQuack->Quack();
    }

protected:
    IFlyBehavior* m_pFly;
    IQuackBehavior* m_pQuack;
};

class CMallardDuck : public CDuck
{
public:
    CMallardDuck()
    {
        m_pFly = new CFlyWithWings();
        m_pQuack = new CQuack();
    }

    void Display()
    {
        cout<<"I'm a real Mallard duck"<<endl;
    }
};

class CModelDuck : public CDuck
{
public:
    CModelDuck()
    {
        m_pFly = new CFlyNoWay();
        m_pQuack = new CQuack();
    }

    void Display()
    {
        cout<<"I'm a model duck"<<endl;
    }
};

 

调用方法:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;

 // initialize MFC and print and error on failure
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: change error code to suit your needs
  _tprintf(_T("Fatal Error: MFC initialization failed\n"));
  return 1;
 }

    CDuck* pMallard = new CMallardDuck();
    pMallard->PerformQuack();
    pMallard->PerformFly();

    delete pMallard;
    pMallard = NULL;

    CDuck* pModel = new CModelDuck();
    pModel->PerformFly();
    pModel->SetFlyBehavior(new CFlyRocketPowered());
    pModel->PerformFly();

    delete pModel;
    pModel = NULL;

 return nRetCode;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值