定义
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。
角色
目标(Subject):它是被观察的对象。在目标角色中定义了一个观察者集合,可以通过增加或删除方法来管理观察者,同时它还定义了一个通知方法。
具体目标(ConcreteSubject):它是目标类的子类,通常包含有发生改变的数据。当数据发生改变后将会向各个观察者发出通知。
观察者(Observer):观察者一般为接口,它将对观察目标发生的改变做出反应。
具体观察者(ConcreteObserver):在对目标角色发生改变后做出自己的具体反应。通常会包含一个具体目标的引用,保持状态改变一致的同时,可以将自己从目标集合中添加或删除。
优点
可以实现表示层和数据逻辑层的分离
在观察目标和观察者之间建立一个抽象的耦合
支持广播通信,简化了一对多系统设计的难度
符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便
缺点
将所有的观察者都通知到会花费很多时间
如果存在循环依赖时可能导致系统崩溃
没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知道观察目标发生了变化
适用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用
一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁
需要在系统中创建一个触发链
案例
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队中的某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将做出响应。
现使用观察者模式设计并实现该过程,以实现战队成员之间的联动。