一、模式定义
定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并更新;
模式的优点:
1)满足开闭原则;
2)可以在运行时建立对象之间的关系;
二、示例代码
1 /**
2 * 类描述: 观察者模式
3 *
4 * @author XXSD
5 * @version 1.0.0
6 * @date 2020/2/4 0004 下午 4:24
7 */
8 public class ObserverTest {
9 public static void main(String[] values) {
10 final Suject<Object> objectSuject = new Suject<>();
11 objectSuject.addObserver(new ObserverTask1());
12 objectSuject.addObserver(new ObserverTask2());
13 objectSuject.alter(123);
14 }
15 }
16
17 /**
18 * 类描述: 主题对象
19 * 主题对象其实就是一个容器,包含添加、删除观察者等方法;
20 *
21 * @author : XXSD
22 * @date : 2020/2/4 0004 下午 4:26
23 */
24 class Suject<T> {
25
26 /**
27 * 属性描述:定义一个观察者容器
28 *
29 * @date : 2020/2/4 0004 下午 4:31
30 */
31 List<Observer<T>> observerList = new ArrayList<>(16);
32
33 /**
34 * 功能描述:添加观察者
35 *
36 * @author : XXSD
37 * @date : 2020/2/4 0004 下午 4:32
38 */
39 public void addObserver(Observer<T> observer) {
40 observerList.add(observer);
41 }
42
43 /**
44 * 功能描述:移除观察者
45 *
46 * @author : XXSD
47 * @date : 2020/2/4 0004 下午 4:33
48 */
49 public void removeObserver(Observer<T> observer) {
50 observerList.remove(observer);
51 }
52
53 /**
54 * 功能描述:修改被触发时通知所有观察者
55 *
56 * @author : XXSD
57 * @date : 2020/2/4 0004 下午 4:37
58 */
59 public void alter(T value) {
60 for (Observer<T> observer : observerList) {
61 observer.updata(value);
62 }
63 }
64 }
65
66 /**
67 * 类描述: 观察者接口
68 *
69 * @author : XXSD
70 * @date : 2020/2/4 0004 下午 4:27
71 */
72 interface Observer<T> {
73 /**
74 * 功能描述:更新处理方法
75 * @param object 需要处理的数据
76 * @author : XXSD
77 * @date : 2020/2/4 0004 下午 4:30
78 */
79 void updata(T object);
80 }
81 /**
82 * 类描述: 观察者实现
83 * @author : XXSD
84 * @date : 2020/2/4 0004 下午 4:40
85 */
86 class ObserverTask1 implements Observer<Object> {
87
88 /**
89 * 功能描述:更新处理方法
90 *
91 * @param object 需要处理的数据
92 * @author : XXSD
93 * @date : 2020/2/4 0004 下午 4:30
94 */
95 @Override
96 public void updata(Object object) {
97 System.out.println(this.getClass().getSimpleName() + "执行方法");
98 }
99 }
100 /**
101 * 类描述: 观察者实现
102 * @author : XXSD
103 * @date : 2020/2/4 0004 下午 4:40
104 */
105 class ObserverTask2 implements Observer<Object> {
106
107 /**
108 * 功能描述:更新处理方法
109 *
110 * @param object 需要处理的数据
111 * @author : XXSD
112 * @date : 2020/2/4 0004 下午 4:30
113 */
114 @Override
115 public void updata(Object object) {
116 System.out.println(this.getClass().getSimpleName() + "执行方法");
117 }
118 }
三、在Java中的经典应用
3.1)java.util.Observable
这个类就是一个观察者模式的经典应用;
1)“private Vector obs;”容器对象;
2)notifyObservers通知方法;
3.2)org.springframework.context.ApplicationListener
是Spring中事件监听器的接口,这里也是观察者模式的一个经典应用;