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 观察者模式
观察者对观察目标,就像汽车对信号灯。一个对象状态变化,影响另一个对象,也就是依赖关系。一个目标可对应多个观察者。