观察者设计模式是面向对象编程中一种常见的设计模式,它用于在对象之间建立一种一对多的依赖关系,这使得一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。观察者设计模式通常由一个主题和若干个观察者对象组成,主题对象为观察者对象提供注册、删除和通知的接口。
UML图是统一建模语言(Unified Modeling Language)的图形表示法,它是一种用来描述软件系统结构、行为和交互的标准化工具。在面向对象编程中,UML图通常用来表示类和对象之间的关系,其中最常用的是类图和对象图。观察者设计模式的UML图是描述该模式在代码中的实现方式。
类图
观察者设计模式的类图包括以下几个部分:主题(Subject)、具体主题(ConcreteSubject)、观察者(Observer)和具体观察者(ConcreteObserver)。
主题是定义了注册、删除和通知观察者的接口,通常包括一个用于保存观察者的列表和一个用于通知所有观察者的方法。具体主题则是主题接口的实现类,它维护了一个状态,当状态发生变化时就通知所有观察者。
观察者是定义了接收通知并更新自身状态的接口,通常包含一个更新状态的方法。具体观察者是观察者接口的实现类,它通常会将自身注册到一个具体主题,并在收到通知时更新自身状态。
下图是观察者设计模式的基本类图:

对象图
观察者设计模式的对象图包括以下几个对象:具体主题1(ConcreteSubject1)、具体主题2(ConcreteSubject2)、观察者1(Observer1)、观察者2(Observer2)、观察者3(Observer3)。
具体主题1和具体主题2是具体主题类的对象,它们实现了主题接口,并维护了自己的状态(SubjectState)。当状态发生变化时,它们会通知所有注册的观察者。
观察者1、观察者2和观察者3是具体观察者类的对象,它们实现了观察者接口,并将自己注册到具体主题1或具体主题2中。当具体主题1或具体主题2的状态发生变化时,它们会收到通知并更新自身状态(ObserverState)。
下图是观察者设计模式的基本对象图:

使用场景
观察者设计模式通常在以下场景中使用:
1. 当一个对象的行为依赖于另一个对象的状态时。
2. 当一个对象需要将自己的状态变化通知给其他对象时。
3. 当一个对象需要能够通知多个对象,并且不希望这些对象之间互相依赖。
4. 当需要实现动态绑定时,即运行时决定哪些对象需要接收通知。
5. 当多个对象需要观察同一个对象并按照特定顺序响应通知时。
优点和缺点
观察者设计模式具有以下优点:
1. 简化对象之间的关系,避免了对象之间的直接耦合。
2. 可以动态地添加或删除观察者,实现了松耦合。
3. 使得对象之间的依赖关系更加灵活,增强了系统的可扩展性。
但是观察者设计模式也存在以下缺点:
1. 如果观察者较多,通知所有观察者可能会导致性能问题。
2. 通知观察者的顺序是随机的,如果需要一定的顺序,则需要额外的管理。
3. 观察者和具体主题之间的关系可能会变得复杂,增加了系统的复杂度。
扫码咨询 领取资料