2024.10.11 | cuithink | 702次围观
观察者模式它是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应的作出反应
在观察者模式中有如下角色:
Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要与具体目标保持一致.
相当于观察者通过具体的方法进行注册到被观察者的一个列表中,然后观察者发生变化时,会遍历这个列表,通知到现在存活的观察者。
代码实现
//抽象观察者 public interface Observer { //update方法: 为不同观察者的更新(响应)行为定义相同的接口,不同的观察者对该方法有不同的实现 public void update(); } //具体观察者 public class ConcreteObserverOne implements Observer { @Override public void update() { //获取消息通知,执行业务代码 System.out.println("ConcreteObserverOne 得到通知!"); } } //具体观察者 public class ConcreteObserverTwo implements Observer { @Override public void update() { //获取消息通知,执行业务代码 System.out.println("ConcreteObserverTwo 得到通知!"); } }
public interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObservers(); } //具体目标类 public class ConcreteSubject implements Subject { //定义集合,存储所有观察者对象 private ArrayList<Observer> observers = new ArrayList<>(); //注册方法,向观察者集合中增加一个观察者 @Override public void attach(Observer observer) { observers.add(observer); } //注销方法,用于从观察者集合中删除一个观察者 @Override public void detach(Observer observer) { observers.remove(observer); } //通知方法 @Override public void notifyObservers() { //遍历观察者集合,调用每一个观察者的响应方法 for (Observer obs : observers) { obs.update(); } } }
发布订阅模式与观察者模式的区别
发布订阅模式属于广义上的观察者模式,发布订阅模式是最常用的一种观察者模式的实现,并且从解耦和重用角度来看,更优于典型的观察者模式
操作流程上的区别:
观察者模式:数据源直接通知订阅者发生改变。
发布订阅模式: 数据源告诉第三方(事件通道)发生了改变,第三方再通知订阅者发生了改变。
观察者模式常见的使用场景
一个对象的改变,需要改变其他对象的时候
一个对象的改变,需要进行通知的时候
粤ICP备16076548号
发表评论