-
观察者模式
- 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新,也叫做订阅模式Publish/Subscribe,属于行为型模式
-
应用场景
- 消息通知里面:邮件通知、广播通知、微信朋友圈、微博私信等,就是监听观察事件
- 当一个对象的改变需要同时改变其他对象,且它不知道具体有多少对象有待改变的时候,考虑使用观察者模式
-
角色
-
Subject主题:持有多个观察者对象的引用,抽象主题提供了一个接口可以增加和删除观察者对象;有一个观察者数组,并实现增、删及通知操作
-
Observer抽象观察者:为具体观察者定义一个接口,在得到主题的通知时更新自己
-
ConcreteSubject具体主题:将有关状态存入具体观察者对象,在具体主体内部状态改变时,给所有登记过的观察者发出通知
-
ConcreteObserver具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态保持一致
-
-
代码示例,以上班摸鱼观察老板动向为例
import java.util.ArrayList; import java.util.List; /** * 消息发布者 */ class Subject { private List<Observer> observerList = new ArrayList<>(); /** * 新增观察者 */ public void addObserver(Observer observer) { this.observerList.add(observer); } /** * 删除观察者 */ public void deleteObserver(Observer observer) { this.observerList.remove(observer); } /** * 通知所有观察者 */ public void notifyAllObserver() { for (Observer observer : this.observerList) { observer.update(); } } } /** * 抽象观察者 */ interface Observer { void update(); } /** * 消息发布者:老板 */ class BossConcreteSubject extends Subject { public void doSomething() { System.out.println("老板要过来啦"); super.notifyAllObserver(); } } /** * 消息的消费者:老王,可以有多个消费者 */ class LWConcreteObserver implements Observer { @Override public void update() { System.out.println("老王发现老板来了,停止摸鱼"); } } public class Main { public static void main(String[] args) { // 创建一个主题 BossConcreteSubject subject = new BossConcreteSubject(); // 创建观察者 LWConcreteObserver observer = new LWConcreteObserver(); // 建立对应的关系 subject.addObserver(observer); // 主题开始活动,里面会通知观察者(相当于发布消息) subject.doSomething(); } }
-
优点
- 降低了目标与观察者之间的耦合关系,目标与观察者之间建立了一套触发机制
- 观察者和被观察者是抽象耦合的
-
缺点
-
观察者和观察目标之间有循环依赖的话,会触发它们之间进行循环调用,可能导致系统崩溃
-
一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
-
设计模式之观察者模式
最新推荐文章于 2025-05-31 21:05:50 发布