设计模式之禅-观察者模式

xiaoxiao2025-05-31  30

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是在一个项目中经常使用的模式,定义如下: Define a one-to-mang dependency between objects so that when one object changes state,all its dependents are notified and updated automatically (定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

Subject:被观察者

定义被观察者必须实现的职责,它必须能够动态添加、删除观察者。它一般 是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者(notifyObservers)

Observer观察者

观察者收到信息后,即进行update操作,对接收的信息进行处理 观察者是被被观察者管理的

ConcreteSubject具体的被观察者

定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。

ConcreteObserver具体的观察者

每个观察者在接收到消息后处理反应是不同,各个观察者有自己的处理逻辑。

被观察者抽象接口

public interface Observable { //添加一个观察者 public void addObserver(Observer observer); //删除一个观察者 public void deleteObserver(Observer observer); //通知所有观察者 public void notifyObservers(String context); }

具体实现类

public class Subject implements Observable{ //定义一个观察者数组 private Vector<Observer> obsverVector = new Vector<Observer>(); //添加一个观察者 public void addObserver(Observer observer){ obsver.add(observer); } //删除一个观察者 public void deleteObserver(Observer observer){ obsverVector.remove(obserber); } //通知所有观察者 public void notifyObservers(String context){ for(Observer o : obsverVector){ o.update(context); } } //业务逻辑,dosomething时通知所有在数组中的观察者 public void dosomething(){ /** dosth */ notifyObservers("dosth"); } }

观察者接口

public interface Observer { //根据被观察者推送的信息,观察者进行更新信息 public void update(String context); }

具体的client中

说下思路 先建立subject实例 然后建立不同的观察者实例 subject里面添加不同的观察者实例(当然也可以删除) 在subject更新事件的时候(可以通知观察者)

优点

观察者和被观察者之间是抽象耦合(增加观察者还是被观察者都非常容易扩展)建立一套触发机制(被观察者改变,触发导致观察者发生变化)

缺点

观察者模式需要考虑开发效率和运行效率,一个被观察者,多个观察者。开发和调试比较复杂,而且java中消息通知是顺序执行,一个观察者卡壳或者挂了,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。

异步处理问题 异步处理就要考虑线程安全和队列的问题,还是看一看Message Queue,会有更深的了解。(作者表示:没看过,以后再看)

转载请注明原文地址: https://www.6miu.com/read-5031002.html

最新回复(0)