设计模式之观察者模式:监听目标对象的状态改变

场景

场景:

一:

(1)比如我们有一个目标对象,

一旦这个目标对象的状态改变了,

然后的话就去通知相关的对象,

我的状态改变了,数据也变化了。

(2) 我们基于jdk自带的组件实现观察者模式:Observable

二:

电商项目中,订单中心通知库存中心修改库存之后,库存中心通过调度中心去调用仓储中心时候,可以使用观察者模式,在库存中心中将修改的订单结果通知调度中心。

内容

  1. 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。

1.观察者模式

给主体(Subject)绑定一个观察者(ConcreteObserver),观察者可以获取到主体的状态变化(update)

1.1 类图
1.2 代码
复制代码
public class ObserverPattern2 {
    public static void main(String[] args) {
        //给主体绑定一个观察者: 告诉主体:哪个观察者在观察你;
        //往对象里面添加观察者需要继承jdk自带的加锁的Observable类

        //1.创建主体对象:默认状态为0
        Subject subject = new Subject(0);

        //2.注册/绑定一个观察者
        Observer observer = new ObserverPattern.ConcretObserver();
        subject.addObserver(observer);

        //3.主体变化,监听变化
        subject.setState(1);

    }


    public static class ConcreteObserver implements Observer{

        public void update(Observable observable, Object o) {
            Subject subject = (Subject) o;
            Integer state = subject.getState();
            System.out.println("观察者:目标对象的状态变化成:" + state);
        }
    }

    public static class Subject extends Observable{
        private Integer state;

        public Subject(Integer state){
            this.state = state;
        }

        public Integer getState() {
            return state;
        }

        public void setState(Integer state) {
            //在这里状态发生改变
            this.state=state;
            //通知关联的一些观察者,说我的状态变化了
            this.setChanged();
            //this.notifyObservers(state);//此处通知ConcreteObserver
            this.notifyObservers(this);//此处通知ConcreteObserver
        }
    }
}

2.总结

**优点:**1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

**缺点:**1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

相关推荐
范中勤14 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
浅尝辄止;17 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤17 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
408高手1 天前
23种设计模式
设计模式
沫璃染墨1 天前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
sarasuki2 天前
MCP 为什么是一个协议而不是一个框架呢?
设计模式·agent·mcp
geovindu2 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
染指11102 天前
140.Agent-多Agent框架-Agent执行Skills流程
数据库·人工智能·设计模式·langchain·agents
sarasuki3 天前
Agent 是怎么做错误处理的呢?
人工智能·设计模式·agent
A1Book3 天前
从 0 设计历史专题资料汇编的 AI Agent 编排架构——六轮真实任务复盘
设计模式