設計模式3-行爲型模式

5. 行爲型模式

5.1 模板模式(重要)

定義算法框架(純虛函數),將一些步驟延遲到子類中,如沖茶葉、衝咖啡的步驟。

class DringkTemplate
{
public:
	//煮水,沖泡,倒入,加料
	virtual void BoilWater() = 0;
	virtual void Brew() = 0;
	virtual void PourInCup() = 0;
	virtual void AddSomething() = 0;

	void Make()
	{
		this->BoilWater();
		this->Brew();
		this->PourInCup();
		this->AddSomething();
	}
};

5.2 策略模式

封裝一系列算法,而且可相互替換,根據客戶而變化。

下面是人物使用武器的例子。


class WeaponStrategy
{
public:
	virtual void Attack() {}// = 0;
};

class Sword : public WeaponStrategy
{};

class AK47: public WeaponStrategy
{};

class Character
{
public:
	void SetWeapon(WeaponStrategy* pWeapon)
	{
		m_pWeapon = pWeapon;
	}
	void UseWeapon()
	{
		m_pWeapon->Attack();
	}
private:
	WeaponStrategy* m_pWeapon;
};

5.3 命令模式

別名,action模式,transaction模式。將請求封裝,可排隊、記錄日誌,可撤銷。

class HandleClientProtocol
{
public:
	void AddMoney() {}
	void UpdatePlayerLevel() {}
	//...
};

class AbstractRequest
{
public:
	virtual void Handle() = 0;

	AbstractRequest(HandleClientProtocol* pHandleProtocol)
	{
		this->m_pHandleProtocol = pHandleProtocol;
	}
public:
	HandleClientProtocol* m_pHandleProtocol;
};
class AddMoney : private AbstractRequest
{
	virtual void handle()
	{
		m_pHandleProtocol->AddMoney();
	}
};

class Server
{
public:
	void AddRequest(AbstractRequest* pRequest)
	{
		m_queCommands.push(pRequest);
	}
	void start()
	{
		while (!m_queCommands.empty())
		{
			Sleep(2000);
			AbstractRequest* pRequest = m_queCommands.front();
			pRequest->Handle();
			m_queCommands.pop();
		}
	}
private:
	queue<AbstractRequest*> m_queCommands;
};

5.4 觀察者模式

觀察者對觀察目標,就像汽車對信號燈。一個對象狀態變化,影響另一個對象,也就是依賴關係。一個目標可對應多個觀察者。

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