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

本文介绍了设计模式中的备忘录模式,并对比了观察者模式与发布订阅模式。观察者模式中,被观察者维护观察者列表,在状态改变时通知观察者;发布订阅模式则通过消息队列实现发布者与订阅者的解耦。文章通过代码示例展示了观察者模式的实现,并指出了两种模式的优缺点及其应用场景。

写在前面

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

行为型模式—备忘录模式

硬肝系列目录

创建型模式

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

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

python牛牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值