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

场景

场景:

一:

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

相关推荐
geovindu18 小时前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
是2的10次方啊19 小时前
设计模式与生活⑧:快递到了,别一直刷物流
设计模式
raindayinrain2 天前
c++设计模式
开发语言·c++·设计模式
工一木子2 天前
设计模式与生活⑦:你打的车,隔着一个平台
设计模式
电子科技圈2 天前
2026 RISC-V中国峰会观察:编译调试工具链的“在场节奏”,释放了什么信号?
大数据·人工智能·设计模式·软件工程·软件构建·代码规范·risc-v
电子科技圈2 天前
Arm电机控制开发工具哪家强?
arm开发·单片机·嵌入式硬件·设计模式·软件构建
驰骋工作流2 天前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
是2的10次方啊3 天前
设计模式与生活⑦:你打的车,隔着一个平台
设计模式
geovindu3 天前
rust: Read-Write Lock Pattern
开发语言·后端·设计模式·rust·读写锁模式·同步型模式
收纳过往4 天前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava