Repository navigation
Expand file tree
/
Copy pathObserverPatternExample.java
More file actions
99 lines (84 loc) · 2.88 KB
/
Copy pathObserverPatternExample.java
File metadata and controls
99 lines (84 loc) · 2.88 KB
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
// 观察者接口
interface Observer {
void update(String message);
}
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String message);
}
// 具体主题类
class ConcreteSubject implements Subject {
private final Object lock = new Object();
private final Observer[] observers = new Observer[10]; // 最多支持10个观察者
private int size = 0;
@Override
public void registerObserver(Observer observer) {
synchronized (lock) {
if (size < observers.length) {
observers[size++] = observer;
} else {
System.out.println("Cannot register more observers.");
}
}
}
@Override
public void removeObserver(Observer observer) {
synchronized (lock) {
for (int i = 0; i < size; i++) {
if (observers[i] == observer) {
System.arraycopy(observers, i + 1, observers, i, size - i - 1);
observers[size - 1] = null;
size--;
break;
}
}
}
}
@Override
public void notifyObservers(String message) {
Observer[] snapshot;
synchronized (lock) {
snapshot = observers.clone(); // 创建观察者数组的快照
}
for (Observer observer : snapshot) {
if (observer != null) {
new Thread(() -> observer.update(message)){}.start();
}
}
}
// 模拟状态变化,通知观察者
public void stateChanged(String newState) {
System.out.println("Subject state changed to: " + newState);
notifyObservers(newState);
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private final String observerName;
public ConcreteObserver(String name) {
this.observerName = name;
}
@Override
public void update(String message) {
System.out.println(observerName + " received message: " + message);
}
}
public class ObserverPatternExample {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
// 创建观察者
ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
// 注册观察者
subject.registerObserver(observer1);
subject.registerObserver(observer2);
// 改变状态,通知观察者
subject.stateChanged("New state!");
// 可选:移除一个观察者
subject.removeObserver(observer1);
// 再次改变状态,通知观察者
subject.stateChanged("Another new state!");
}
}