定义
观察者模式(又称发布-订阅模式)定义了一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
结构图
分析
Subject将所有的具体主题集合到一起,具有添加和删除具体主题的功能,Notify也担任通知者的角色,运行所有观察者的更新内容Update。当状态发生改变时,使用Notify来对所有的观察者来进行更新。Observer即为抽象观察者,其子类为具体观察者,具体观察者中实现Update方法,Update中为对于该观察者具体的更新内容。比如游戏中玩家捡到了令所有怪物HP减半的神器,此时Subject监听到该事件,然后运行Notify对所有怪物血量进行更新。
因此使用该模式的场合为当一个对象的改变需要同时改变其他对象的时候,且它不知道具体由多少对象有待改变。当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。因此,观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
如果具体的观察者都是风马牛不相及的类,可以使用接口来实现,只要都实现Update即可。
事件委托实现观察者模式(不使用Observer)
由于有些代码已经被封装或不为同一类,不能依赖于Observer抽象类来进行添加和删除具体观察者,因此我们可以通过事件委托来实现。
首先在具体通知者中神明一个事件委托。
public event EventHandler Update;
然后把具体观察者中运行的更新的方法都通过委托挂钩到具体通知者的Update上。
player.Update += new EventHandler(playerController.runfast);
player.Update += new EventHandler(playerController.jumphigh);