Skip to content

Commit 02d80e1

Browse files
committed
add design pattern observer
1 parent c28a0c8 commit 02d80e1

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# 观察者模式
2+
3+
```java
4+
5+
// 1. 观察者接口(订阅者)
6+
interface Observer {
7+
void update(String message); // 收到通知时的处理方法
8+
}
9+
10+
// 2. 被观察者接口(发布者)
11+
interface Subject {
12+
void registerObserver(Observer o); // 添加订阅者
13+
void removeObserver(Observer o); // 取消订阅
14+
void notifyObservers(); // 通知所有订阅者
15+
}
16+
17+
18+
19+
/**
20+
* 3. 具体被观察者(微信公众号)<br/>
21+
* <strong>被观察者(Subject)</strong> :就像微信公众号<br/>
22+
* 观察者(Observer):就像订阅公众号的用户<br/>
23+
* 当公众号发布新文章(状态改变),所有订阅用户都会收到通知
24+
*/
25+
class WeChatPublicAccount implements Subject {
26+
private List<Observer> observers = new ArrayList<>();
27+
private String message; // 新发布的消息
28+
29+
@Override
30+
public void registerObserver(Observer o) {
31+
observers.add(o);
32+
}
33+
34+
@Override
35+
public void removeObserver(Observer o) {
36+
observers.remove(o);
37+
}
38+
39+
@Override
40+
public void notifyObservers() {
41+
for (Observer o : observers) {
42+
o.update(message); // 通知每个订阅者
43+
}
44+
}
45+
46+
// 发布新消息
47+
public void publishMessage(String msg) {
48+
this.message = msg;
49+
System.out.println("公众号发布新消息: " + msg);
50+
notifyObservers(); // 发布后自动通知所有订阅者
51+
}
52+
}
53+
54+
// 4. 具体观察者(微信用户)
55+
class WeChatUser implements Observer {
56+
private String name;
57+
58+
public WeChatUser(String name) {
59+
this.name = name;
60+
}
61+
62+
@Override
63+
public void update(String message) {
64+
System.out.println(name + " 收到消息: " + message);
65+
}
66+
}
67+
68+
// 5. 测试代码
69+
public class ObserverDemo {
70+
@Test void observerTest() {
71+
// 创建公众号
72+
WeChatPublicAccount account = new WeChatPublicAccount();
73+
74+
// 创建用户
75+
Observer user1 = new WeChatUser("张三");
76+
Observer user2 = new WeChatUser("李四");
77+
Observer user3 = new WeChatUser("王五");
78+
79+
// 用户订阅公众号
80+
account.registerObserver(user1);
81+
account.registerObserver(user2);
82+
account.registerObserver(user3);
83+
84+
// 公众号发布消息(自动通知所有订阅者)
85+
account.publishMessage("Java设计模式系列文章更新啦!");
86+
87+
System.out.println("----- 李四取消订阅后 -----");
88+
account.removeObserver(user2); // 李四取消订阅
89+
90+
account.publishMessage("观察者模式详解"); // 李四不会收到这条消息
91+
}
92+
}
93+
94+
```

0 commit comments

Comments
 (0)