大话设计模式——15.观察者模式(Observer Pattern)

简介

也称发布订阅模式(Publish/Subscribe),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

UML图:
应用场景:
  • 消息通知组件:邮件通知、广播通知、朋友圈、私信等
  • 当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象有待改变时
示例
  1. 观察者:Observer
java 复制代码
public interface Observer {

    /**
     * 更新状态
     */
    void updateState();
}
java 复制代码
public class ConcreteObserver01 implements Observer {


    private String observerName;

    private Subject subject;

    public ConcreteObserver01(String observerName, Subject subject) {
        this.observerName = observerName;
        this.subject = subject;
    }

    @Override
    public void updateState() {
        System.out.println(subject.getAction() + "," + observerName + "进入工作状态");
    }
}
java 复制代码
public class ConcreteObserver02 implements Observer {


    private String observerName;

    private Subject subject;

    public ConcreteObserver02(String observerName, Subject subject) {
        this.observerName = observerName;
        this.subject = subject;
    }

    @Override
    public void updateState() {
        System.out.println(subject.getAction() + "," + observerName + "进入工作状态");
    }
}
  1. 目标/主体:Subject
java 复制代码
public class Subject {

    private List<Observer> observerList = new ArrayList<>();

    private String action;

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public void addObserver(Observer observer) {
        observerList.add(observer);
    }


    public void delObserver(Observer observer) {
        observerList.remove(observer);
    }

    public void notifyObserver() {
        for (Observer observer : observerList) {
            observer.updateState();
        }
    }

}
java 复制代码
public class BossSubject extends Subject {
}
  1. 运行
java 复制代码
public class Main {

    public static void main(String[] args) {
        Subject bossSubject = new BossSubject();
        Observer concreteObserver01 = new ConcreteObserver01("01员工摸鱼", bossSubject);
        Observer concreteObserver02 = new ConcreteObserver02("02员工摸鱼", bossSubject);
        bossSubject.addObserver(concreteObserver01);
        bossSubject.addObserver(concreteObserver02);

        bossSubject.setAction("老板开始巡视");
        bossSubject.notifyObserver();

    }
}
总结
  • 优点:

    • 观察者与被观察者是抽象耦合的,降低了目标与观察者之间的耦合关系
    • 目标与观察者之间建立了一套触发机制
  • 缺点

    • 观察者与被观察者之间如果存在循环依赖,可能会触发彼此之间的循环调用,导致系统崩溃
    • 若一个被观察者对象存在大量观察者对象,如果这些观察者对象都需要通知,会耗费大量时间
相关推荐
Memory_荒年14 分钟前
自定义 Spring Boot Starter:手搓“轮子”,但要搓出兰博基尼!
java·后端
栈外26 分钟前
我是IDEA重度用户,试了4款AI编程插件:有一款有并发Bug,有一款越用越香
java·后端
架构师沉默35 分钟前
为什么说 Go 做游戏服务器就有人皱眉?
java·后端·架构
a56299161937 分钟前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
秃了也弱了。1 小时前
ElasticSearch:优化案例实战解析(持续更新)
android·java·elasticsearch
文心快码BaiduComate1 小时前
Comate内置模型已支持 MiniMax-M2.7!
设计模式·程序员·前端框架
一叶落4381 小时前
LeetCode 54. 螺旋矩阵(C语言详解)——模拟 + 四边界收缩
java·c语言·数据结构·算法·leetcode·矩阵
最初的↘那颗心1 小时前
Prompt 工程实战:五要素框架与 Spring AI 模板化落地
java·大模型·prompt工程·spring ai·ai应用开发
东离与糖宝2 小时前
Java 21 虚拟线程与 AI 推理结合的最新实践
java·人工智能