如果两块代码耦合,意味着你必须同时了解这两块代码。如果你让他们解耦,那么你只需要了解其一。观察者模式便是专为实现它而诞生的:“在对象间定义一种一对多的依赖关系,以便当某对象状态改变时,与它存在依赖关系的所有对象都能收到通知并自动进行更新”。大家一定都听说过一直很流行的MVC框架,其底层就是观察者模式。观察者模式应用十分广泛,在游戏中善用观察者模式,可以让你的代码更加“纯净”。
假设你现在在维护一个横版动作游戏,主角的任务就是一路砍杀,最终虐杀BOSS。杀敌的路上充满了坎坷,为了对玩家更加友好,策划要求主角在打破一个木桶时,在UI界面上给出一句提示“打破所有木桶即可开启密道”。类似的需求可能有很多,战斗系统的各种特殊状况都可能需要UI界面的配合,但是我们真的要直接把UI显示的代码加入战斗系统吗?答案是否定的,如果我们这样做显然会增加UI系统和战斗系统的耦合,下次再去修改一个UI的时候,你很可能就要去先去看看为什么战场里的怪物会追着你不放了。这时候观察者模式就派上用场了,它使得战场能够发出一个消息,并通知对消息感兴趣的对象,而不用关心是谁收到了通知。
大致是下面这个样子:
void MoveableObject::OnAttack(AttackParameters& stAttackParameters)
{
CalAttack(stAttackParameters); if (m_iMyHp <= 0 && m_iType == OBJECT_TYPE::WOOD)
{
notify(stAttackParameters.m_pFighter, EVENT_WOOD_DEAD);
}
}

