策略模式 C++實現

目錄

一、鴨子模擬器的實現

二、類圖

三、實現鴨子抽象類

 四、定義一隻綠頭鴨

五、定義一隻模型鴨

 六、定義飛的行爲

1.定義飛的行爲接口類

 2.實現 會飛 的行爲

3.實現不會飛的行爲

七、實現鴨子 叫 的行爲

1.實現叫的接口

 2.實現鴨子 呱呱叫 的行爲

 3.實現鴨子 吱吱叫 的行爲

 4.實現鴨子 不會叫 的行爲

 八、測試

十、完整代碼實現

十一、參考資料


摘要

  策略模式體現了 “針對接口編程,而不是針對實現編程”,如有的鴨子會叫,有的鴨子不會叫,把鴨子叫的行爲委託給(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設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章