文章目录
  1. 1. 观察者模式(发布/订阅模式)
  2. 2. 适用场景
  3. 3. Code

观察者模式(发布/订阅模式)

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。

适用场景

  • 当一个对象的改变需要改变其它对象时,而且它不知道具体有多少个对象有待改变时。

  • 一个抽象模型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

Code

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* 很常见的例子:猎头和求职者,求职者订阅了猎头职位的信息。有新的职位时,求职者将会收到信息。
*/
//---------------------------------法1:自定义实现
//1.抽象发布者
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyAllObservers();
}
//2.抽象订阅者
public interface Observer {
//这里一般来说有“推模式”和“拉模式”,这里采用“拉模式”
public void update(Subject s);
}
//1.具体发布者
public class HeadHunter implements Subject {
private List<Observer> userList;
private List<String> jobs;
public HeadHunter() {
this.userList = new ArrayList<>();
this.jobs = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
userList.add(o);
}
@Override
public void removeObserver(Observer o) {
userList.remove(o);
}
@Override
public void notifyAllObservers() {
for(Observer observer :userList){
observer.update(this);
}
}
public void addJob(String job) {
this.jobs.add(job);
this.notifyAllObservers();
}
public List<String> getJobs(){
return this.jobs;
}
@Override
public String toString(){
return this.jobs.toString();
}
}
//1.具体订阅者
public class JobSeeker implements Observer {
private String name;
public JobSeeker(String name) {
this.name = name;
}
@Override
public void update(Subject s) {
System.out.println(this.name + "got notified! ");
System.out.println(s);
}
}
//---------------------------------法2:利用java中已有观察者模式接口
//---------------------------------import java.util.Observable;--------------------------
//---------------------------------import java.util.Observer;----------------------------
class HeadHunter extends Observable{
private List<String> jobs = new ArrayList<>();
public void addJob(String job){
this.jobs.add(job);
this.setChanged();//状态改变
this.notifyObservers();
}
}
class JobSeeker implements Observer{
@Override
public void update(Observable o, Object arg) {
}
}
文章目录
  1. 1. 观察者模式(发布/订阅模式)
  2. 2. 适用场景
  3. 3. Code