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 觀察者模式
觀察者對觀察目標,就像汽車對信號燈。一個對象狀態變化,影響另一個對象,也就是依賴關係。一個目標可對應多個觀察者。