指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
1、观察者和被观察者是抽象耦合的,一个目标仅仅知道他有一系列的观察者,每个都符合AbstractObserver的接口,但是不知道任何一个观察者属于哪一具体类。这样目标和观察者之间的耦合是抽象的和最小的。
2、建立一套触发机制。支持广播通信,不像通常的请求通信,目标的发送者不需要指定它的接受者。通知被自动广播给所有已经向该目标对象登记过的有关对象。
3、符合“开闭原则”,增加新的具体观察者无须修改原有的系统代码。
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
在以下任一情况下都可以使用观察者模式:
当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;
当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。
两大类(主题(被观察者)和观察者)
四个角色:
举例子理解,优化使用智能指针:https://zhuanlan.zhihu.com/p/119308881