观察者模式是一种设计模式,它允许对象(称为“观察者”或“主题”)维护一个其状态发生变化时被通知的对象列表,这种模式通常用于实现事件处理系统,例如在GUI应用程序中处理用户输入、定时器和动画等。
观察者模式的核心思想是:当一个对象的状态发生改变时,所有依赖于这个状态的对象都会得到通知并自动更新,这种通知是通过发送消息给所有注册的观察者对象来实现的。
观察者模式的关键组件
- 主题(Subject):负责维护观察者列表,并在状态变化时通知所有观察者。
- 具体观察者(ConcreteObserver):实现了观察者接口,并知道如何响应接收到的通知。
- 抽象观察者(AbstractObserver):定义了观察者接口,让具体观察者继承。
- 状态(State):表示主题需要改变状态的对象。
- 通知(Notification):当状态改变时,发送给所有观察者的特定消息。
观察者模式的优势
- 解耦:使得主题与观察者之间的依赖关系变得松散,提高了系统的可扩展性和可维护性。
- 易于扩展:可以很容易地添加新的观察者,而不需要修改主题类。
- 易于测试:由于观察者模式遵循单一职责原则,因此更容易进行单元测试。
观察者模式的实现方式
- 创建观察者:创建一个具体观察者类,该类实现了
Observer
接口。 - 注册观察者:将具体观察者添加到主题的观察者列表中。
- 状态改变:当主题的状态发生变化时,调用通知方法来通知所有注册的观察者。
示例代码
// 观察者接口 interface Observer { void update(String message); } // 具体观察者类 class ConcreteObserverA implements Observer { @Override public void update(String message) { System.out.println("ConcreteObserverA received: " + message); } } // 抽象观察者类 abstract class AbstractObserver implements Observer { protected List<Observer> observers = new ArrayList<>(); @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void update(String message) { for (Observer observer : observers) { observer.update(message); } } } // 主题类 class Subject { private String state; private List<Observer> observers = new ArrayList<>(); public void setState(String state) { this.state = state; notifyObservers(); } public void addObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } private void notifyObservers() { for (Observer observer : observers) { observer.update(this.state); } } } // 测试代码 public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); ConcreteObserverA observerA = new ConcreteObserverA(); AbstractObserver observerB = new AbstractObserver(); Observer observerC = new Observer(); // 未实现Observer接口 subject.addObserver(observerA); subject.addObserver(observerB); subject.addObserver(observerC); // 这里会抛出异常,因为observerC没有实现Observer接口 subject.setState("Changed"); // 状态改变,应该通知所有观察者 } }
观察者模式是一种强大的设计模式,它允许你轻松地实现事件处理系统,通过使用观察者模式,你可以确保当主题的状态发生变化时,所有的观察者都能得到通知并相应地更新自己的状态,这使得你的应用程序更加灵活和可扩展。