Strategy模式C++实现
2011-08-01 16:26
302 查看
说明:将《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;
}
飞翔行为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;
}
相关文章推荐
- [GoF设计模式]Proxy模式和Strategy模式的C++实现
- 大话设计模式--策略模式 strategy -- C++实现实例
- 常见设计模式的解析和实现(C++)之十六-Strategy模式
- Head First设计模式C++实现-Strategy模式
- C++实现策略(Strategy)模式
- Head First设计模式C++实现-Strategy模式
- Strategy模式C++实现
- Head First 设计模式 C++实现-Strategy(策略模式)
- C++实现Behavioral - Strategy模式
- 常见设计模式的解析和实现(C++)之十六-Strategy模式
- 设计模式的解析和实现(C++)之十六-Strategy模式
- HeadFirst设计模式 之 C++实现(一):Strategy(策略模式) && 初入设计模式殿堂
- 设计模式之C++实现(二)---策略模式(Strategy)
- C++实现策略(Strategy)模式
- 设计模式系列1-----C++实现策略模式(Strategy)
- 设计模式C++实现(2)——策略模式(strategy)
- 设计模式之strategy模式(C++实现)
- 设计模式之strategy模式(C++实现)
- C++实现Behavioral - Strategy模式
- Head First 设计模式 C++实现-Strategy(策略模式)