观察者模式

1.定义

观察者模式定义了一种一堆多的依赖关系,当一个对象的状态发生改变时,所有依赖于它对象都会得到通知。观察者模式也被成为发布-订阅模式。实现了解耦,在需要新增一个观察者的时候只需要new一个出来,然后注册到主题对象就可以了,在观察者不需要观察该主题对象,只需要在主题对象的观察者列表中去除该观察者对象即可。

2.结构图

img

  • Subject: 被观察者的对象抽象类。其中包含了观察者的集合,添加和删除观察者的方法。还有通知观察者观察对象已改变的方法
  • Observer:抽象观察者类。只有一个响应接口,响应接口中定义了被观察者。响应接口除了需要做出需要做的事情之外,还需要将自己注册到被观察者中去。

3.实例

被观察者的对象抽象类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 被观察的对象父类
*/
public abstract class Subject {
/**
* 定义一个集合存储被观察者
*/
List<Observer> observerList = new ArrayList<>();

/**
* 添加监听者
* @param observer
*/
public void addObserver(Observer observer) {
observerList.add(observer);
}

/**
* 删除监听者
* @param observer
*/
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}

// 做出什么事情后,监听者会有所反应
public abstract void signature();

public void report() {
for(Observer observer : observerList) {
observer.response(this);
}
}
}

观察者抽象类

1
2
3
4
public interface Observer {
// 监听者的反应
public void response(Subject subject);
}

具体被观察者类

1
2
3
4
5
6
7
public class Student extends Subject {
@Override
public void signature() {
System.out.println("我要吃饭呜呜呜");
report();
}
}

具体观察者类

1
2
3
4
5
6
7
public class Teacher implements Observer {
@Override
public void response(Subject subject) {
subject.addObserver(this);
System.out.println("老师说:好好学习,以后每顿都能吃上两个肉");
}
}