2023-02-22
原文作者:键盘林 原文地址:https://blog.csdn.net/qq_37909508/category_8976362.html

观察者模式

定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发送变化时,它的所有依赖者(观察者)都会收到通知并更新

类型:行为型

适用场景:

关联行为场景,建立一套触发机制

优点:

观察者和被观察者之间建立一个抽象的耦合

观察者模式支持广播通信

缺点:

观察者之间有过多的细节依赖。太高时间消耗及程序复杂度

使用要得当,要避免循环调用

Coding:

创建Course:

202302222108587411.png

创建Qustion类

202302222109000352.png

创建Teacher类(Teacher是观察者,Course是被观察者)

202302222109011433.png

JDK中对于被观察者提供了Observable类

202302222109021294.png

进入到Observable

202302222109032975.png

不仅是使用了线程安全的Vector,而且它内部的很多方法也同样时线程安全的

202302222109049976.png

202302222109068017.png

通知观察者

202302222109082418.png

202302222109097139.png

回到Course类中,编写productQuestion()方法

2023022221091139210.png

查看setChanged()方法

2023022221091272211.png

将问题发送给对应的观察者

2023022221091402212.png

让Teacher这个观察者实现Observer接口

2023022221091549213.png

进入到Observer,可以看到它只有一个方法

第一个参数o:被观察的对象

第二个参数arg:notifyObservers方法传过来的对象(也就是被观察者里面通过notifyObservers方法传递过来的参数)

2023022221091658314.png

2023022221091804515.png

继续编写update()方法

2023022221091921416.png

创建Test类

2023022221092046517.png

运行结果

2023022221092210518.png

查看当前UML类图

2023022221092320119.png

总结:观察者模式核心在于Observer和Observable两个接口将三个类联系起来

其主要业务逻辑在update()方法中进行处理。

在增加一个老师:

2023022221092470120.png

2023022221092614821.png

JDK中的应用 :

在java中有一个按钮,当我们按下之后,就会触发相应的事件,这就是监听,采用的也是观察者模式。

类Event

2023022221092809922.png

类RequestContextListener

2023022221092965823.png

进入到类ServletRequestListener

2023022221093178424.png

2023022221093379525.png

阅读全文