设计模式 —— 观察者模式(Observer)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/89764713

【概述】

软件系统常常要求在某一个对象的状态发生变化时,某些其它的对象做出相应的改变,由于减少对象的耦合利于系统的复用,同时为了使这些低耦合度的对象间能够维持行动协调一致,保证高度协作,因此有了观察者模式。

观察者模式又称发布-订阅模式(Publish/Subscribe),多用于订阅功能的场景,例如:微博的订阅

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己,其本质是:触发联动

目标提供了对观察者的维护,其可被多个观察者观察,当目标的状态发生变化时,要负责通知所有注册的、有效地观察者,因此,目标与观察者之间是典型的一对多关系,且观察者单向依赖于目标,而多个观察者之间是平行的,相互不应该有先后的依赖关系。

此外,由于观察者模式可以相互观察,因此要注意观察的目标,以避免出现死循环。

【UML】

观察者模式涉及到了四个角色:

  • 抽象主题角色:Subject,将对所有观察者对象的引用存在一个聚类中,每个主题都可以有任意数量的观察者,其提供了一个接口,可以增加、删除观察者对象。
  • 抽象观察者角色:Observer,为所有的具体观察者定义一个接口(更新接口),在得到主题的通知时更新自己,更新接口中一般只包含一个方法(Update() 方法),即更新方法
  • 具体主题角色:Concrete Subject,其将有关状态存入具体现察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知,通常用一个具体子类实现
  • 具体观察者角色:Concrete Observer,具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调,如果需要,具体现察者角色可以保存一个指向具体主题对象的引用,通常用一个具体子类实现 

【优缺点】

优点:

  • 实现了动态联动
  • 实现了观察者和目标之间的抽象耦合
  • 支持广播通信,被观察者会向所有的登记过的观察者发出通知 

缺点:由于采用广播方式,不管观察者需不需要,每个观察者都会被调用 update() 方法,因此可能会引起无谓的操作。

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/89764713