写在前面
各位看官老爷如果本篇文章对你有帮助就给个赞赞赞赞赞吧
行为型模式—备忘录模式
硬肝系列目录
创建型模式
结构型模式
行为型模式
到目前为止、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