观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
在观察者模式中,有两个核心角色:主题(Subject)和观察者(Observer)。
- 主题(Subject):也称为被观察者或可观察对象,维护一组观察者,并提供方法用于添加、删除和通知观察者。当主题的状态发生变化时,它会主动通知所有已注册的观察者。
- 观察者(Observer):表示接收主题通知的对象。观察者需要实现一个特定的接口或抽象类,该接口或抽象类定义了接收通知的方法。当主题状态发生变化时,观察者会根据通知进行相应的更新操作。
观察者模式的优点包括:
- 松耦合:主题与观察者之间是松耦合的关系,主题只需要知道观察者的接口,而不需要知道具体的实现。
- 可扩展性:可以方便地增加新的观察者或主题,而无需修改现有代码。
- 一致性:主题状态发生变化时,所有观察者都会得到相应的通知和更新,保持数据的一致性。
// 主题接口 interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } // 观察者接口 interface Observer { void update(); } // 具体主题类 class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); private int state; public void setState(int state) { this.state = state; notifyObservers(); } public int getState() { return state; } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 具体观察者类 class ConcreteObserver implements Observer { private String name; private ConcreteSubject subject; public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } public void update() { System.out.println(name + " 收到更新,新状态为 " + subject.getState()); } } // 示例程序 public class ObserverPatternExample { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver("Observer 1", subject); ConcreteObserver observer2 = new ConcreteObserver("Observer 2", subject); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.setState(1); // 输出: // Observer 1 收到更新,新状态为 1 // Observer 2 收到更新,新状态为 1 subject.setState(2); // 输出: // Observer 1 收到更新,新状态为 2 // Observer 2 收到更新,新状态为 2 subject.removeObserver(observer2); subject.setState(3); // 输出: // Observer 1 收到更新,新状态为 3 } }
这是一个简单的观察者模式示例,主题(ConcreteSubject)维护了一组观察者(ConcreteObserver),当主题状态发生变化时,通知所有注册的观察者进行更新。观察者收到通知后,执行相应的操作。