0%

观察者模式

观察者模式

定义对象间一种一对多的依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新

核心概念

  • Observer 观察者接口 将多个订阅者称为观察者
  • ConcreteObserver 观察者具体实现对象
  • Subject 目标对象 多个观察者观察的对象被称为目标
  • ConcreteSubject 具体的目标实现对象
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
/**
* 观察者接口
* @author zh
* @date 2022/10/13 14:22
*/
public interface Observer {

// 更新的接口
void update(Subject subject);
}

/**
* @author zh
* @date 2022/10/13 14:26
*/
public class ConcreteObserver implements Observer{

@Override
public void update(Subject subject) {

System.out.println("目标有改动,需要进行处理");

}
}

/**
* 目标对象
* @author zh
* @date 2022/10/13 14:22
*/
public class Subject {
// 保存观察者对象
private List<Observer> observers = new ArrayList<>();

// 注册观察者
public void attach(Observer observer){
observers.add(observer);
}

// 删除观察者
public void detach(Observer observer){
observers.remove(observer);
}

// 通知观察者
public void notifyObservers(){
for(Observer observer : observers){
observer.update(this);
}
}
}

/**
* @author zh
* @date 2022/10/13 14:28
*/
public class ConcreteSubject extends Subject{

private int state;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
// 通知
this.notifyObservers();
}
}

优缺点

优点

  • 实现了观察者和目标之间的抽象耦合
  • 实现了动态联动
  • 支持广播通信

缺点

  • 由于是广播通信,可能会造成无谓的操作

使用场景

  • 当有两个方面,且一个方面依赖于另一个方面的状态变化
  • 在更改一个对象时,需要连带着改变其他对象,且不知道有多少对象需要被连带改变
  • 当一个对象必须通知其他的对象,但又希望这个对象和其他被通知的对象是松耦合的

欢迎关注我的其它发布渠道