观察者(Observer)模式
# 观察者(Observer)模式
观察者模式 (Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布 - 订阅(Publish/Subscribe)模式、模型 - 视图(Model/View)模式、源 - 监听器(Source/Listener)模式或从属者(Dependents)模式。对象行为型模式

Subject: 目标
public abstract class AbstractTikToker {
// 添加粉丝
abstract void addFans(AbstractFans fans);
// 通知粉丝
abstract void notifyFans(String msg);
}
1
2
3
4
5
6
7
2
3
4
5
6
7
ConcreteSubject: 具体目标
public class MMTikToker extends AbstractTikToker {
// 观察者的核心1
List<AbstractFans> fansList = new ArrayList<>();
@Override
void addFans(AbstractFans fans) {
System.out.println("粉丝+1");
fansList.add(fans);
}
@Override
void notifyFans(String msg) {
// 观察者核心2
for (AbstractFans fans : fansList) {
fans.acceptMsg(msg);
}
}
void startSell() {
System.out.println("主播开始卖货");
notifyFans("主播开始卖货了");
}
void endSell() {
System.out.println("主播结束卖货");
notifyFans("主播结束卖货了");
}
}
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
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
Observer: 观察者
/**
* 抽象观察者
*/
public abstract class AbstractFans {
// List<AbstractTikToker> tikTokers; // 双向观察
abstract void acceptMsg(String msg);
void follow(AbstractTikToker tikToker) {
// 主播粉丝+1
tikToker.addFans(this);
// for (AbstractTikToker toker : tikTokers) {
//
// }
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ConcreteObserver: 具体观察者
public class RobotFans extends AbstractFans{
@Override
void acceptMsg(String msg) {
System.out.println("刷流量刷流量");
}
}
1
2
3
4
5
6
2
3
4
5
6
public class HumanFans extends AbstractFans {
@Override
void acceptMsg(String msg) {
System.out.println("收到通知:" + msg);
System.out.println("粉丝进入了直播间");
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
测试
public class MainTest {
public static void main(String[] args) {
MMTikToker mmTikToker = new MMTikToker();
mmTikToker.startSell();
System.out.println("-----");
// 关注主播
RobotFans fans = new RobotFans();
fans.follow(mmTikToker);
HumanFans fans1 = new HumanFans();
fans1.follow(mmTikToker);
HumanFans fans2 = new HumanFans();
fans2.follow(mmTikToker);
mmTikToker.endSell();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 应用场景
什么场景用到?
- Spring 事件机制如何实现?
- Vue 的双向绑定核心
- 响应式编程核心思想
Jdk 的 Observable 类就使用了观察者模式

# 观察者模式的好处
- 观察者模式设计后,会以集合的方式来管理用户 (Observer),包括注册,移除和通知。
- 这样,我们增加观察者 (这里可以理解成一个新的公告板),就不需要去修改核心类 WeatherData 不会修改代码,遵守了 ocp 原则。
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02