[设计模式] - 观察者模式

一、观察者模式简介

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. 业务说明

现实生活中针对与观察者模式的映射场景实在是太多了。就比如很多小伙伴小时候一定有过一种同学:这种人只要你有了违规的举动,他就会立刻向你的班主任反应以达到损人利己的目的,班主任获得你违规的消息后,又会针对你做出处罚,而这个业务链其实就是观察者模式中一个最典型的应用。

这里我们将业务模型说的更具体一点,小明是个调皮的孩子,虽然学习成绩不错,但是再上课的时候还是喜欢开小差,比如当老师讲的东西他都会的时候,他喜欢偷偷的打开漫画书看漫画。而这个举动有时就会被他的同桌小红反应给老师。

在这里插入图片描述
那么我们先简单的分析一下这个业务模型中所参与的角色:

  1. 被观察者(Subject):在这个业务模型中很明显就是小明,你的一举一动都被你同桌那个间谍观察者。
  2. 观察者(Observer):没错,观察者就是那个成天向老师打小报告的欠蹬(方言,意为爱打小报告的人)。

接下来我们就要做一个简单的代码实现了:

3. 代码实现

  1. 首选创建一个学生接口
public interface Subject {
	void learn();
}
  1. 创建间谍接口
public interface Observer {
	void update();
}
  1. 创建被观察者接口
public interface Subject {

	void registerObserver(Observer observer);

	void deleteObserver(Observer observer);

	void notifyObserver();
}

  1. 观察者实现类(小红)
public class Xiaohong implements Student, Observer {

	@Override
	public void update() {
		System.out.println("小红观察到小明在看漫画,准备向老师打小报告");

	}

	@Override
	public void learn() {
		System.out.println("小红正在专心学习");
	}

}

  1. 被观察者实现类(小明)
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();
		}

	}

}
  1. 测试代码
public class Client {

	public static void main(String[] args) {
		Xiaoming xiaoming = new Xiaoming();
		xiaoming.registerObserver(new Xiaohong());
		xiaoming.cartoon();
	}
}

测试结果:
在这里插入图片描述
到这里一个简单的观察者模式模型就已经完成了。

二、设计思路

1. 设计类图

我们在完成了代码实现后来看一看观察者模式的一个基本设计结构是如何的呢:
在这里插入图片描述
这里可以看到观察者模式其实主要是由两部分组成:

  1. 被观察者(Subject):定义被观察者必须要实现的行为,它能够动态的增加或删除观察者,其必须职责为管理和通知观察者。
  2. 观察者(Observer):观察者主要是负责在接收到被观察者的消息后去做指定的行为,对接收到的信息进行处理。

2. 观察者模式的特点

优点:

  1. 系统拓展性好
  2. 可以建立一套简单的触发器链条

缺点:

  1. 多级触发执行效率欠优

3. 观察者模式的使用场景

  1. 关联行为场景,注意这里的关联行为指的是可拆分的而不是组合的。
  2. 事件多级触发
  3. 跨系统信息交互,如消息队列的处理机制

4. Java中的观察者模式

Java在设计初就已经为开发者准备好了一个观察者接口java.util.Observer和一个被观察者的实现类java.util.Observable,这样我们在实现观察者模式的时候可以直接实现或继承JDK为我们提供的接口即可。
在这里插入图片描述
在这里插入图片描述

三、结语

今天的代理模式讲解就全部结束了,设计模式的相关代码已经在gitee上收录,有需求的小伙伴可以直接拿走:

https://gitee.com/xiaolong-oba/csdn-learning-code.git

有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
博主在这里祝大家可以在新的一年升职加薪,走上人生巅峰!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓龙oba

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

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

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

打赏作者

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

抵扣说明:

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

余额充值