设计模式(6) 观察者模式

01 概述

  • 观察者模式是用于建立一种对象与对象之间的依赖关系,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
    在这里插入图片描述
    1)抽象主题(Subject):
    它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
    2)具体主题(Concrete Subject):
    将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
    3)抽象观察者(Observer):
    为所有的具体观察者定义一个接口,在得到主题通知时更新自己
    4)具体观察者(Concrete Observer):
    实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
  • 在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者。
  • 一个观察目标可以对应多个观察者。
  • 例如在游戏中,一群小兵来攻击一个英雄,当英雄死掉的时候,就会通知小兵(告诉它们“我”没了),小兵的状态就改变了,不再攻击这个英雄了。
  • 还比如在一个目录下建立一个文件,这时系统会通知目录管理器增加目录,并通知磁盘减少空间,在这里,文件就是观察者,目录管理器和磁盘就是被观察者。

02 使用场景

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的。
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

03 优缺点

观察者模式的主要的作用就是将对象解耦,将观察者和被观察者完全隔离。

  • 观察者模式的优点
    观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。
  • 观察者模式的缺点
    在应用观察者模式时需要考虑一下开发小路问题,程序中包括一个被观察者和多个被观察者,开发和调试比较复杂。

猜你喜欢

转载自blog.csdn.net/qq_41363459/article/details/111656259