观察者(Observer)模式可以在多个对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。
什么是观察者模式
观察者模式(Observer pattern)是一种非常常用的设计模式,它可以建立一种一对多的依赖关系,确保当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。在观察者模式中,通常会定义一个主题对象和多个观察者对象。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知这组观察者对象。观察者对象可以是任何类型的对象,它们会在主题对象发生改变时接收到通知,并进行相应的逻辑处理。
观察者模式的应用场景
-
当一个对象的状态改变时,需要通知其他对象进行相应的处理时,可以使用观察者模式。例如,当系统中某个数据模型发生变化时,需要立即通知到已经注册过该模型变化的其他组件进行处理。
-
当需要将不同子系统之间的解耦时,可以使用观察者模式。例如,当子系统之间需要进行消息传递,但是又不希望子系统之间直接进行耦合时,可以使用观察者模式进行消息传递。
观察者模式的代码示例
以下是一个简单的观察者模式示例代码:
主题对象接口:
public interface Subject {public void attach(Observer observer); // 添加观察者public void detach(Observer observer); // 删除观察者public void notifyObservers(); // 通知所有观察者
}
观察者对象接口:
public interface Observer {public void update(); // 观察者对象接收到通知后的逻辑处理
}
具体主题对象类:
public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<Observer>(); // 存储所有观察者对象private int subjectState; // 主题对象状态public void attach(Observer observer) {observers.add(observer); // 添加观察者}public void detach(Observer observer) {observers.remove(observer); // 删除观察者}public void notifyObservers() {for (Observer observer : observers) {observer.update(); // 通知所有观察者}}public int getState() {return subjectState;}public void setState(int state) {this.subjectState = state;notifyObservers(); // 主题对象状态发生改变,通知所有观察者}
}
具体观察者对象类:
public class ConcreteObserver implements Observer {private int observerState; // 观察者对象状态private Subject subject; // 主题对象public ConcreteObserver(Subject subject) {this.subject = subject;subject.attach(this); // 将该观察者对象注册到主题对象中}public void update() {observerState = subject.getState(); // 观察者对象接收到通知后更新自身状态System.out.println("Observer state updated: " + observerState); // 打印输出更新后的状态值}
}
测试代码:
public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject(); // 创建主题对象ConcreteObserver observer1 = new ConcreteObserver(subject); // 创建观察者对象1,并将其注册到主题对象中ConcreteObserver observer2 = new ConcreteObserver(subject); // 创建观察者对象2,并将其注册到主题对象中subject.setState(10); // 改变主题对象的状态,触发所有观察者对象更新逻辑}
}
运行结果:
Observer state updated: 10
Observer state updated: 10
在上面的示例代码中,我们首先定义了主题对象接口 Subject
和观察者对象接口 Observer
。然后我们实现了具体的主题对象类 ConcreteSubject
和具体的观察者对象类 ConcreteObserver
,在具体主题对象类中添加、删除和通知观察者对象,更改状态值并且通知所有的观察者对象。在具体观察者对象类 ConcreteObserver
中,实现更新自身状态的逻辑和打印输出更新后状态原来的值。在 ObserverPatternDemo
中我们创建主题对象,并创建两个观察者对象并将它们注册到主题对象中,再改变主题对象的状态,触发所有观察者对象更新逻辑,最后打印输出更新后的状态值。
观察者模式的实际应用
在实际开发中,观察者模式是一个非常常用的设计模式,在许多框架中都有使用,下面是一些常用框架中使用了观察者 Observer 设计模式的例子:
-
JDK 中的事件机制: JDK 中提供了大量的事件类和接口,从而实现了一种事件驱动模型。例如 ActionListener 接口、MouseListener 接口等等都是观察者接口,实现它们的类都是观察者对象,而主题对象则是事件源对象(如按钮对象等)。
-
Spring 框架中的事件机制: Spring 框架中也提供了事件机制,可以通过 ApplicationContext 对象向所有注册的监听器对象发送事件,从而实现一种松耦合的消息传递方式。在 Spring 中,事件源对象可以是任何对象,而事件监听器就是观察者对象。
-
Android 中的广播机制: Android 中有一种广播机制,可以用于组件间的信息传递。在广播机制中,发送广播的对象就是事件源对象,而广播接收器则是观察者对象。
-
JavaFX 框架中的 Property 机制: JavaFX 中的 Property 对象是观察者模式的实现,它允许绑定两个对象,当其中一个对象的值发生变化时,另一个对象会自动更新为最新值。
关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩💻👨💻!