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

场景

场景:

一:

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

相关推荐
知无不研2 小时前
中介者模式
c++·设计模式·中介者模式
bmseven2 小时前
大白话讲解23种设计模式简介
设计模式
蜜獾云2 小时前
设计模式之代理模式:本地接口代理远程接口的调用
设计模式·系统安全·代理模式
蜜獾云2 小时前
设计模式之访问者模式:动态的给目标对象增加新功能
设计模式·访问者模式
蜜獾云4 小时前
设计模式之策略模式:替换掉糟糕的if else语句实现面向对象编程而非面向过程
设计模式·策略模式
蜜獾云4 小时前
设计模式之状态模式:封装数据的状态流转逻辑
设计模式·状态模式
Serene_Dream4 小时前
深度解析设计模式:单例模式(Singleton Pattern)
单例模式·设计模式
朱一头zcy5 小时前
设计模式入门:最简单的单例模式
笔记·单例模式·设计模式
kuntli5 小时前
23种设计模式全解析
设计模式