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

场景

场景:

一:

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

相关推荐
Rsun045513 小时前
设计模式应该怎么学
java·开发语言·设计模式
_MyFavorite_5 小时前
JAVA重点基础、进阶知识及易错点总结(31)设计模式基础(单例、工厂)
java·开发语言·设计模式
_MyFavorite_16 小时前
JAVA重点基础、进阶知识及易错点总结(32)设计模式(建造者、原型)
java·python·设计模式
妙蛙种子31116 小时前
【Java设计模式 | 创建者模式】单例模式
java·开发语言·后端·单例模式·设计模式
武藤一雄1 天前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
he___H1 天前
Spring中的设计模式
java·spring·设计模式
程序员小寒1 天前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式·ecmascript·命令模式
程序员榴莲2 天前
设计模式之GoF设计模式(单例模式
单例模式·设计模式
砍光二叉树2 天前
【设计模式】行为型-解释器模式
设计模式·解释器模式
砍光二叉树2 天前
【设计模式】行为型-备忘录模式
设计模式·备忘录模式