一、前言
本篇主题为行为型模式中的第四个模式–观察者模式。上篇 Java 设计模式主题为《Java 设计模式之迭代器模式(十五)》。
二、简单介绍
# 2.1 定义
观察者模式是行为模式之一,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
# 2.2 参与角色
- 被观察者(Subject):当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject 需要维持(添加,删除,通知)一个观察者对象的队列列表。
- 观察者(Observer):接口或抽象类。当 Subject 的状态发生变化时,Observer 对象将通过一个 callback 函数得到通知。
# 2.3 应用场景
- 聊天室程序,服务器转发信息给所有客户端。
- 网络游戏,服务器将客户端状态进行分发。
- 邮件订阅等。
三、实现方式
记得笔者在上中学时,所在的学校是禁止在寝室打扑克牌的,但是还是有不少学生违背这条规定,笔者就是其中之一。我们就以这个故事为例,在这个案例中,老师是被观察者,学生则是观察者。学生观察老师是否来到寝室,从而做出不同的行为。
被观察者和子类:
1 | 复制代码public abstract class Subject { |
Teacher 继承 Subject 类,Teacher 的实例就是被观察的对象。
观察者和实现类:
1 | 复制代码public interface Observer { |
客户端:
1 | 复制代码public class Client { |
打印结果:
1 | 复制代码假装学习 |
其实,在 JDK 中已经提供了 java.util.Observable 和 java.util.Observer 来实观察者模式。
实现方式如下:
被观察者:
1 | 复制代码public class Teacher extends Observable{ |
观察者:
1 | 复制代码public class Student implements Observer { |
客户端:
1 | 复制代码public class Client { |
打印结果与上文的一致。
使用 JDK 提供的这 2 个类大大的简化了代码量。
UML 类图表示如下:
本文转载自: 掘金