目錄
摘要
策略模式體現了 “針對接口編程,而不是針對實現編程”,如有的鴨子會叫,有的鴨子不會叫,把鴨子叫的行爲委託給(delegate)給 叫 的接口類去實現,而不是在 鴨子 的類中實現。
一、鴨子模擬器的實現
二、類圖
注意:
(1)Duck "Has-a" FlyBehavior
(2)Duck "Has-a" QuackBehavior
三、實現鴨子抽象類
CDuck.h
#pragma once
#include "FlyBehavior.h"
#include "QuackBehavior.h"
class CDuck
{
public:
CDuck(void);
virtual ~CDuck(void);
public:
void SetFlyBehavior(CFlyBehavior* pFb);
void SetQuackBehavior(CQuackBehavior* pQb);
public:
virtual void PerformQuack();
virtual void PerformFly();
public:
void Swim();
virtual void Display() = 0;
protected:
CFlyBehavior* m_pFlyBehavior;
CQuackBehavior* m_pQuackBehavior;
};
CDuck.cpp
#include "stdafx.h"
#include "Duck.h"
#include <iostream>
#include <afxwin.h>
CDuck::CDuck(void)
{
}
CDuck::~CDuck(void)
{
}
void CDuck::SetFlyBehavior(CFlyBehavior* pFb)
{
m_pFlyBehavior = pFb;
}
void CDuck::SetQuackBehavior(CQuackBehavior* pQb)
{
m_pQuackBehavior = pQb;
}
void CDuck::PerformQuack()
{
m_pQuackBehavior->quack();
}
void CDuck::Swim()
{
AfxMessageBox(_T("All ducks float, even decoys!"), MB_OK);
}
void CDuck::Display()
{
}
void CDuck::PerformFly()
{
m_pFlyBehavior->Fly();
}
四、定義一隻綠頭鴨
CMallardDuck.h
#pragma once
#include "duck.h"
class CMallardDuck : public CDuck
{
public:
CMallardDuck(void);
virtual ~CMallardDuck(void);
public:
void Display();
};
CMallardDuck.cpp
#include "stdafx.h"
#include "MallardDuck.h"
#include "Quack.h"
#include <afxwin.h>
#include "FlyWithWings.h"
CMallardDuck::CMallardDuck(void)
{
m_pQuackBehavior = new CQuack; //呱呱叫
m_pFlyBehavior = new CFlyWithWings;//會飛
}
CMallardDuck::~CMallardDuck(void)
{
}
void CMallardDuck::Display()
{
AfxMessageBox(_T("我是一直綠頭鴨!"), MB_OK);
}
五、定義一隻模型鴨
CModelDuck.h
#pragma once
#include "duck.h"
class CModelDuck :
public CDuck
{
public:
CModelDuck(void);
virtual ~CModelDuck(void);
public:
virtual void Display();
};
CModelDuck.cpp
#include "stdafx.h"
#include "ModelDuck.h"
#include "Quack.h"
#include "FlyNoWay.h"
#include "MuteQuack.h"
CModelDuck::CModelDuck(void)
{
m_pFlyBehavior = new CFlyNoWay; //不會飛
m_pQuackBehavior = new CMuteQuack; //不會叫
}
CModelDuck::~CModelDuck(void)
{
}
void CModelDuck::Display()
{
AfxMessageBox(_T("我是一隻模型鴨!"), MB_OK);
}
六、定義飛的行爲
1.定義飛的行爲接口類
CFlyBehavior.h
#pragma once
class CFlyBehavior
{
public:
CFlyBehavior(void);
~CFlyBehavior(void);
public:
virtual void Fly() = 0;
};
CFlyBehavior.cpp
#include "stdafx.h"
#include "FlyBehavior.h"
CFlyBehavior::CFlyBehavior(void)
{
}
CFlyBehavior::~CFlyBehavior(void)
{
}
2.實現 會飛 的行爲
CFlyBehavior.h
#pragma once
#include "flybehavior.h"
class CFlyWithWings :
public CFlyBehavior
{
public:
CFlyWithWings(void);
virtual ~CFlyWithWings(void);
public:
virtual void Fly();
};
CFlyBehavior.cpp
#include "stdafx.h"
#include "FlyWithWings.h"
#include <afxwin.h>
CFlyWithWings::CFlyWithWings(void)
{
}
CFlyWithWings::~CFlyWithWings(void)
{
}
void CFlyWithWings::Fly()
{
AfxMessageBox(_T("我會飛!"), MB_OK);
}
3.實現不會飛的行爲
CFlyBehavior.h
#pragma once
#include "flybehavior.h"
class CFlyNoWay :
public CFlyBehavior
{
public:
CFlyNoWay(void);
virtual ~CFlyNoWay(void);
public:
virtual void Fly();
};
CFlyBehavior.cpp
#include "stdafx.h"
#include "FlyNoWay.h"
#include <iostream>
#include <afxwin.h>
CFlyNoWay::CFlyNoWay(void)
{
}
CFlyNoWay::~CFlyNoWay(void)
{
}
void CFlyNoWay::Fly()
{
AfxMessageBox(_T("我不會飛!"), MB_OK);
}
七、實現鴨子 叫 的行爲
1.實現叫的接口
CQuackBehavior,h
#pragma once
class CQuackBehavior
{
public:
CQuackBehavior(void);
~CQuackBehavior(void);
public:
virtual void quack() = 0;
};
CQuackBehavior.cpp
#include "stdafx.h"
#include "QuackBehavior.h"
#include <iostream>
#include <afxwin.h>
CQuackBehavior::CQuackBehavior(void)
{
}
CQuackBehavior::~CQuackBehavior(void)
{
}
2.實現鴨子 呱呱叫 的行爲
CQuack.h
#pragma once
#include "quackbehavior.h"
class CQuack : public CQuackBehavior
{
public:
CQuack(void);
virtual ~CQuack(void);
public:
virtual void Quack();
};
CQuack.cpp
#include "stdafx.h"
#include "Quack.h"
CQuack::CQuack(void)
{
}
CQuack::~CQuack(void)
{
}
void CQuack::Quack()
{
AfxMessageBox(_T("呱呱叫!"), MB_OK);
}
3.實現鴨子 吱吱叫 的行爲
CSqueak.h
#pragma once
#include "quackbehavior.h"
class CSqueak :
public CQuackBehavior
{
public:
CSqueak(void);
virtual ~CSqueak(void);
public:
virtual void Quack();
};
CSqueak.cpp
#include "stdafx.h"
#include "Squeak.h"
#include <iostream>
#include <afxwin.h>
CSqueak::CSqueak(void)
{
}
CSqueak::~CSqueak(void)
{
}
void CSqueak::Quack()
{
AfxMessageBox(_T("吱吱叫!"), MB_OK);
}
4.實現鴨子 不會叫 的行爲
CMuteQuack.h
#pragma once
#include "quackbehavior.h"
class CMuteQuack :
public CQuackBehavior
{
public:
CMuteQuack(void);
virtual ~CMuteQuack(void);
public:
virtual void Quack();
};
CMuteQuack.cpp
#include "stdafx.h"
#include "MuteQuack.h"
#include <iostream>
#include <afxwin.h>
CMuteQuack::CMuteQuack(void)
{
}
CMuteQuack::~CMuteQuack(void)
{
}
void CMuteQuack::Quack()
{
AfxMessageBox(_T("不會叫!"), MB_OK);
}
八、測試
CMiniDuckSimulator.h
#include "stdafx.h"
#include "MiniDuckSimulator.h"
#include "Duck.h"
#include "MallardDuck.h"
#include "ModelDuck.h"
#include "FlyRocketPowered.h"
CMiniDuckSimulator::CMiniDuckSimulator(void)
{
}
CMiniDuckSimulator::~CMiniDuckSimulator(void)
{
}
void CMiniDuckSimulator::Test()
{
CDuck* mallard = new CMallardDuck; //綠頭鴨
mallard->PerformQuack();
mallard->PerformFly();
//
CDuck *pModel = new CModelDuck; //模型鴨
pModel->PerformFly();
pModel->SetFlyBehavior(new CFlyRocketPowered);
pModel->PerformFly();
}
CMiniDuckSimulator.cpp
#pragma once
class CMiniDuckSimulator
{
public:
CMiniDuckSimulator(void);
~CMiniDuckSimulator(void);
public:
void Test();
};
十、完整代碼實現
https://github.com/mc-liyanliang/Design-patterns/tree/master/Strategy%20Pattem
十一、參考資料
《Head First設計模式》