0%

设计模式-观察者模式

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

类图

3Mzs8x.md.png

实现

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
import java.util.ArrayList;
import java.util.List;

public abstract class Subject {

private List<Observer> observers = new ArrayList<>();

/**
* 增加观察者
*
* @param observer
*/
public void attach(Observer observer) {
observers.add(observer);
}

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

/**
* 通知
*/
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}

}
1
2
3
4
5
public abstract class Observer {

public abstract void update();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ConcreteSubject extends Subject {

private String subjectState;

public String getSubjectState() {
return subjectState;
}

public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ConcreteObserver extends Observer {

private String name;
private ConcreteSubject concreteSubject;

public ConcreteObserver(ConcreteSubject concreteSubject, String name) {
this.name = name;
this.concreteSubject = concreteSubject;
this.concreteSubject.attach(this);
}

@Override
public void update() {
System.out.println("观察者" + name + "获取的主题状态是:" + concreteSubject.getSubjectState());
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Client {

public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(subject, "X");
ConcreteObserver observer2 = new ConcreteObserver(subject, "Y");
ConcreteObserver observer3 = new ConcreteObserver(subject, "Z");

// 更新状态并通知
subject.setSubjectState("A");
subject.notifyObservers();

// 删除一个观察者
subject.detach(observer2);
// 更新状态并通知
subject.setSubjectState("B");
subject.notifyObservers();
}

}