观察者模式(Observer Pattern)是一种行为设计模式,属于面向对象设计模式的一种。它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动更新。
观察者模式涉及两种主要角色:
主题(Subject): 也称为被观察者或可观察对象,它维护一系列依赖于它的观察者对象,并在自身状态改变时通知它们。
观察者(Observer): 定义了一个更新接口,用于在主题状态发生变化时接收通知。具体的观察者实现这个接口以便在状态发生变化时更新自身。
以下是观察者模式的一般结构:
Subject(主题): 维护一组观察者,提供注册和删除观察者的方法,以及通知观察者的方法。
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
ConcreteSubject(具体主题): 实现主题接口,负责维护观察者列表和通知观察者。
public class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } }
Observer(观察者): 定义一个更新接口,用于接收主题的通知。
public interface Observer { void update(); }
ConcreteObserver(具体观察者): 实现观察者接口,具体定义在主题发生变化时应该执行的操作。
public class ConcreteObserver implements Observer { @Override public void update() { // 执行观察者更新操作 } }
使用观察者模式的一个常见场景是 GUI 界面中的事件处理,其中用户界面元素(主题)的状态变化会通知相关的 UI 组件(观察者)进行更新。观察者模式提供了一种松耦合的设计,使得主题和观察者之间可以独立演化,更容易扩展和维护。