观察者模式是一种行为型设计模式,其主要目的是定义对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都将自动收到通知并进行相应的更新。
在《设计模式》讲义中,第4章提出了一个问题:设计一套图表工具,用于展示选中的数据,当选中的数据状态发生变化时,自动更新图表显示。观察者模式正是为了解决这类问题而提出的。
在这个情景下,我们可以将图表工具视为观察者(Observer),而选中的数据则是被观察者(Subject)。当数据发生改变时,被观察者将通知所有的观察者进行相应的更新操作。
观察者模式的设计结构包含三个核心角色:Subject(被观察者)、Observer(观察者)和ConcreteSubject(具体的被观察者)。
Subject是一个抽象类,定义了一系列用于管理和通知观察者的方法,例如attach(Observer)用于添加观察者,detach(Observer)用于移除观察者,notify()用于通知观察者进行更新。Subject类通常维护一个观察者列表,可以通过getState()方法获取当前的状态。
Observer是一个接口,定义了一个抽象的更新方法update(Subject)。具体的观察者需要实现这个接口,并在update方法中实现自己的更新逻辑。
ConcreteSubject是具体的被观察者类,继承自Subject类。它提供了一个change()方法用于改变自身的状态,并通知所有观察者进行更新。通过getState()方法可以获取当前的状态。
在图表工具的设计中,我们可以将饼图和柱状图作为具体的观察者类,它们实现了Observer接口,并在update方法中实现了自身的更新逻辑,例如重新绘制图表等操作。
当选中的数据发生变化时,ConcreteSubject会调用自身的change()方法来改变状态,并通知所有的观察者进行更新。观察者收到通知后,会调用自身的update方法进行更新操作,从而实现了图表的自动更新显示。
观察者模式的优点在于解耦了被观察者和观察者之间的关系,使得它们可以独立地进行扩展和修改,而不会相互影响。同时,可以灵活地添加和删除观察者,实现动态的依赖关系。
总结而言,观察者模式是一种非常常用的设计模式,在许多情况下都能发挥重要的作用。它通过定义一种依赖关系,使得多个对象之间可以进行简洁高效的通信和交互。同时,观察者模式的设计结构清晰,易于理解和实现。在实际的软件开发中,合理地运用观察者模式可以提高代码的可维护性和复用性。