提示:观察者模式的代码实现、观察者模式的使用场景、观察者模式源码级别的应用、观察者模式的优点、
文章目录
前言
随着时间的推移,我现在越来越感觉自己的代码不够优雅了,相信有一部分博友跟我有同样的困扰,因此决定再学习记录一下相关的设计模式。今天就介绍一下设计模式-观察者模式
一、定义
模式定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并更新。
二、类图
- 其中subject 代表着主题对象。subject中的attach代表着添加观察者的方法(需要观察这个对象的时候加进来,不需要的时候移除)、detach代表着删除观察者的方法(不感兴趣的时候可以移除这个观察者)、notify代表着观察着发生变化的方法。
- observer代表着观察着对象。他的update方法,就是主题对象改变了以后,观察者对象要改变的方法
三、代码实现
代码如下:
c
package com.zheng.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author: ztl
* @date: 2024/09/19 22:20
* @desc: 观察着模式,测试类
*/
public class ObserverTest {
public static void main(String[] args) {
MySuject subject = new MySuject();
TaskAObserver taskAObserver = new TaskAObserver();
TaskBObserver taskBObserver = new TaskBObserver();
subject.addObserver(taskAObserver);
subject.addObserver(taskBObserver);
// subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start TaskBObserver start
subject.removeObserver(taskBObserver);
// 把B的task从监听的中去掉了,所以只有a继续观察了
subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start
}
}
/**
* 定义一个类,这个就是被观察的对象
*/
class MySuject{
// 容器(也就是所有观察这个对象的观察者)
private List<MyObserver> list = new ArrayList<>();
// add
public void addObserver(MyObserver myObserver){
list.add(myObserver);
}
// remove
public void removeObserver(MyObserver myObserver){
list.remove(myObserver);
}
// 具体的改变方法,就是被观察的对象发生改变的方法,
public void notifyObserver(Object object){
for (MyObserver myObserver : list){
myObserver.update();
}
}
}
/**
* 观察者模式的接口,他下面可以有多少实现
*/
interface MyObserver{
void update();
}
/**
* 观察者的第一个实现类
*/
class TaskAObserver implements MyObserver{
@Override
public void update() {
System.out.println("TaskAObserver start");
}
}
/**
* 观察者的第二个实现类
*/
class TaskBObserver implements MyObserver{
@Override
public void update() {
System.out.println("TaskBObserver start");
}
}
四、应用场景
当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先未知或动态更改时,倾使用观察者模式
优点:
1.符合开闭原则
2.可以在运行时简历对象之间的关系
五、源码级别的应用
c
JDK中:
java util.Observable;
Spring中:
org.springframework.context.ApplicationListener
总结
今天跟媳妇儿聊天的时候,就随口一提:现在看spring源码看的我瞌睡,昏昏沉沉的。媳妇儿问我,那你之前不困吗?我答:不,我之前不看源码(手动狗头)