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

场景

场景:

一:

(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、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

相关推荐
剧中有戏10 小时前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客14 小时前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
许彰午14 小时前
政务低代码平台实战(总纲)——从元数据引擎到可视化设计器的五个关键决策
低代码·rxjava·政务
莫得感情 o15 小时前
设计模式 18 · 状态模式
设计模式·状态模式
莫得感情 o16 小时前
设计模式 17 · 责任链模式
设计模式·责任链模式
用户938515635071 天前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
今天的砖头有点烫手啊2 天前
AI Agent 开发实战(十):Agent 设计模式(ReAct / Plan-Execute / Reflection)
人工智能·react.js·设计模式
董员外2 天前
RAG 系统进化论(十):可运营 RAG,从原型到长期运行的知识系统
人工智能·后端·设计模式
莫得感情 o2 天前
设计模式 15 · 模板方法模式
设计模式·模板方法模式