观察者模式和发布订阅模式都是设计模式中的一种,它们都用于实现对象之间的松耦合。观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。而发布订阅模式则是一种松耦合的消息范式,可以实现高伸缩性、高可靠性、灵活性和可测试性 。,,两者最大的区别在于发布订阅模式有个事件调度中心,而观察者模式由具体目标调度。每个被订阅的目标里面都需要有对观察者的处理,这种处理方式比较直接粗暴,但是会造成代码的冗余。
本文目录导读:
在编程中,我们经常遇到需要在对象之间传递消息的情况,当一个对象的状态发生变化时,我们需要通知其他所有依赖于这个对象的对象,这时,我们就可以使用观察者模式,观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。
什么是观察者模式?
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式的主要角色
1、主题(Subject):也被称为“被观察者”或者“消息发布者”,它是所有其他对象所必须有的接口,它维护了一系列的观察者对象,并在状态改变时通知这些观察者对象。
2、观察者(Observer):也被称为“被观察者的订阅者”或者“消息接收者”,它是主题对象的一个客户,当主题对象的状态发生改变时,它将自动调用自己的更新方法。
3、第三方(Third Party):这是一些和主题对象及观察者对象都有关联的对象,它们可以访问主题对象和观察者对象,但是它们并不直接操作它们。
为什么使用观察者模式?
1、当一个对象的状态发生改变时,如果没有其他的依赖于它的对象来知道这个变化,那么这个对象就无法完成它的职责,通过使用观察者模式,我们可以确保任何一个依赖于它的对象都知道这个变化。
2、如果有很多的对象都依赖于同一个主题对象,那么如果每一个对象都需要去通知主题对象,那么这将会是一个非常耗时的操作,通过使用观察者模式,我们可以让主题对象只需要通知一次所有的观察者对象,从而大大提高了效率。
如何实现观察者模式?
在Java中,我们可以使用java.util.Observable类和java.util.Observer接口来实现观察者模式,下面是一个简单的例子:
import java.util.Observable; import java.util.Observer; class Student extends Observable { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public void setAge(int age) { this.age = age; setChanged(); // 标记状态已经改变 notifyObservers(); // 通知所有的观察者对象 } } class MyObserver implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("The student's age has been changed to " + arg); } } public class Main { public static void main(String[] args) { Student student = new Student("Tom", 20); MyObserver observer = new MyObserver(); student.addObserver(observer); // 添加观察者对象 student.setAge(21); // 更改学生年龄,将触发观察者的update方法 } }
在这个例子中,Student类继承了Observable类,所以它是一个被观察者,MyObserver类实现了Observer接口,所以它是一个观察者,当我们更改Student的年龄时,所有注册的观察者都会收到通知。