设计模式之观察者模式(发布订阅模式 > 观察者模式)

写在前面

各位看官老爷如果本篇文章对你有帮助就给个赞赞赞赞赞吧
在这里插入图片描述

行为型模式—备忘录模式

硬肝系列目录

创建型模式

23种设计模式之工厂模式

23种设计模式之抽象工厂模式

23种设计模式之建造者模式

23种设计模式之原型模式

23种设计模式之单例模式

结构型模式

23种设计模式之适配器模式

23种设计模式之桥梁模式

23种设计模式之代理模式

23种设计模式之外观模式

23种设计模式之装饰器模式

23种设计模式之享元模式

23种设计模式之组合模式

行为型模式

23种设计模式之责任链模式

23种设计模式之命令模式

23种设计模式之迭代器模式

23种设计模式之中介者模式

23种设计模式之备忘录模式

23种设计模式之观察者模式

到目前为止、23种设计模式的创建型模式 and 结构型模式都已经给大家肝完了,现在我们进入到一个全新的章节!!!

什么是观察者模式(Observer pattern)

有很多人一开始以为观察者模式就是发布订阅模式,如果面试的时候加上肯定的语气就会被直接请回家等通知了,这里我给大家明确

发布订阅模式 ≠ 观察者模式

发布订阅模式 ≠ 观察者模式

发布订阅模式 ≠ 观察者模式

在这里插入图片描述
我给大家解释一下

观察者模式被观察者(Subject)内部维护了一个观察者的列表(List < Observer > ),就是当一个被观察者被修改时,则会自动通知观察者对象,但是不能直接通知观察者对象,一般都是定义一个观察者对象的接口,然后实现该观察者对象接口,所以观察者模式为松耦合

发布订阅模式,不只是只有发布者和订阅者,而是在二者的通信之间加上了MQ(消息队列),也就是说发布者和订阅者是不知道彼此的真实身份的,发布者将消息发送到MQ的某个topic(类似我们说的主题)中,订阅者去订阅MQ中的topic,当这个topic存在数据时,是订阅者去拉取消息还是MQ推送消息需要根据MQ和订阅者协商来设置,所以发布订阅模式是完全解耦

所以这就解释了为什么我的标题为**(发布订阅模式 > 观察者模式)**,但是二者都各有优缺点,发布订阅模式引入了MQ,大大增加了系统的复杂度,对于MQ后面我会专门开一个专题来给大家解释,我们这次用代码来看看观察者模式

这里我们直接上代码来展示观察者模式的应用

定义一个被观察者

import java.util.ArrayList;
import java.util.List;

public class Subject {
    private List<Observer> observers;

    public Subject(){
        observers = new ArrayList<>();
    }

    public void add(Observer observer){
        observers.add(observer);
    }

    public void remove(Observer observer){
        observers.remove(observer);
    }

    public void notifyObserver(String msg){
        for (Observer observer : observers){
            observer.doSomething(msg);
        }
    }
}

被观察者主要维护了

一个观察者列表,用于保存观察者的信息,以便发送消息

添加、删除观察者的方法

定义一个观察者接口

public interface Observer {
    void doSomething(String msg);
}

再定义两个观察者的实现类

public class ObserverXiaoMing implements Observer{
    @Override
    public void doSomething(String msg) {
        System.out.println(this.getClass().getSimpleName() + " 收到消息:" + msg);
        //做各自的业务处理
        System.out.println("do something...");
    }
}
public class ObserverMeiko implements Observer{
    @Override
    public void doSomething(String msg) {
        System.out.println(this.getClass().getSimpleName() + " 收到消息:" + msg);
        //做各自的业务处理
        System.out.println("do something...");
    }
}

也就是说,当我被观察者有事件发生时,就会通知依赖于它的观察者,达到维护一对多的依赖关系

我们来看看测试代码

public class Test {
    public static void main(String[] args) {
        //新建一个被观察者
        Subject subject = new Subject();
        //定义两个观察者
        Observer observer1 = new ObserverXiaoMing();
        Observer observer2 = new ObserverMeiko();
        //将两个观察者添加进被观察者所维护的列表
        subject.add(observer1);
        subject.add(observer2);
        //发送消息
        subject.notifyObserver("中路清完兵线去下路了!!!");
    }
}

执行结果
在这里插入图片描述
缺点:

当观察者很多的时候,通知观察者是一件耗时很长的事件

如果在观察者和被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,可能导致系统崩溃,资源消耗严重

观察者只能观察到被观察对象所发生变化的结果,观察不到变化的过程

完成:TO: 2021/4/6 00:16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值