一、观察者模式简介
1. 什么是观察者模式
观察者模式(Observer Pattern) 也叫做发布订阅模式,属于行为型设计模式的一种,其定义为:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically (定义对象间一种一对多的依赖关系,使得当唯一对象改变时,所有依赖它的对象都会得到通知并自动更新)。 观察者模式在项目中有着大量的应用,而且它的理解也并不难,简单来说观察者模式就是为了解决数据或行为一致性而提出的解决方案。
2. 业务说明
现实生活中针对与观察者模式的映射场景实在是太多了。就比如很多小伙伴小时候一定有过一种同学:这种人只要你有了违规的举动,他就会立刻向你的班主任反应以达到损人利己的目的,班主任获得你违规的消息后,又会针对你做出处罚,而这个业务链其实就是观察者模式中一个最典型的应用。
这里我们将业务模型说的更具体一点,小明是个调皮的孩子,虽然学习成绩不错,但是再上课的时候还是喜欢开小差,比如当老师讲的东西他都会的时候,他喜欢偷偷的打开漫画书看漫画。而这个举动有时就会被他的同桌小红反应给老师。
那么我们先简单的分析一下这个业务模型中所参与的角色:
- 被观察者(Subject):在这个业务模型中很明显就是小明,你的一举一动都被你同桌那个间谍观察者。
- 观察者(Observer):没错,观察者就是那个成天向老师打小报告的欠蹬(方言,意为爱打小报告的人)。
接下来我们就要做一个简单的代码实现了:
3. 代码实现
- 首选创建一个学生接口
public interface Subject {
void learn();
}
- 创建间谍接口
public interface Observer {
void update();
}
- 创建被观察者接口
public interface Subject {
void registerObserver(Observer observer);
void deleteObserver(Observer observer);
void notifyObserver();
}
- 观察者实现类(小红)
public class Xiaohong implements Student, Observer {
@Override
public void update() {
System.out.println("小红观察到小明在看漫画,准备向老师打小报告");
}
@Override
public void learn() {
System.out.println("小红正在专心学习");
}
}
- 被观察者实现类(小明)
public class Xiaoming implements Student, Subject {
private List<Observer> observerList = new ArrayList<>();
@Override
public void learn() {
System.out.println("小明正在努力的学习");
}
public void cartoon() {
System.out.println("小明正在看漫画");
notifyObserver();
}
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserver() {
for (Observer observer : observerList) {
observer.update();
}
}
}
- 测试代码
public class Client {
public static void main(String[] args) {
Xiaoming xiaoming = new Xiaoming();
xiaoming.registerObserver(new Xiaohong());
xiaoming.cartoon();
}
}
测试结果:
到这里一个简单的观察者模式模型就已经完成了。
二、设计思路
1. 设计类图
我们在完成了代码实现后来看一看观察者模式的一个基本设计结构是如何的呢:
这里可以看到观察者模式其实主要是由两部分组成:
- 被观察者(Subject):定义被观察者必须要实现的行为,它能够动态的增加或删除观察者,其必须职责为管理和通知观察者。
- 观察者(Observer):观察者主要是负责在接收到被观察者的消息后去做指定的行为,对接收到的信息进行处理。
2. 观察者模式的特点
优点:
- 系统拓展性好
- 可以建立一套简单的触发器链条
缺点:
- 多级触发执行效率欠优
3. 观察者模式的使用场景
- 关联行为场景,注意这里的关联行为指的是可拆分的而不是组合的。
- 事件多级触发
- 跨系统信息交互,如消息队列的处理机制
4. Java中的观察者模式
Java在设计初就已经为开发者准备好了一个观察者接口java.util.Observer和一个被观察者的实现类java.util.Observable,这样我们在实现观察者模式的时候可以直接实现或继承JDK为我们提供的接口即可。
三、结语
今天的代理模式讲解就全部结束了,设计模式的相关代码已经在gitee上收录,有需求的小伙伴可以直接拿走:
有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
博主在这里祝大家可以在新的一年升职加薪,走上人生巅峰!