- 完整代码(直接复制运行)
java
运行
import java.util.ArrayList;
import java.util.List;
// ==================== 1. 被观察者(发布者:保单) ====================
class PolicySubject {
// 观察者列表(订阅者)
private List<Observer> observers = new ArrayList<>();
// 状态
private String status;
// 1. 添加观察者(订阅)
public void attach(Observer observer) {
observers.add(observer);
}
// 2. 移除观察者(取消订阅)
public void detach(Observer observer) {
observers.remove(observer);
}
// 3. 状态改变 → 自动通知所有观察者
public void setStatus(String status) {
this.status = status;
notifyAllObservers();
}
// 4. 通知所有人
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update(status);
}
}
}
// ==================== 2. 观察者接口(订阅者标准) ====================
interface Observer {
void update(String message); // 收到通知执行
}
// ==================== 3. 具体观察者 ====================
// 观察者1:支付服务
class PayService implements Observer {
@Override
public void update(String message) {
System.out.println("【支付服务】收到通知:" + message + " → 开始扣款");
}
}
// 观察者2:短信服务
class SmsService implements Observer {
@Override
public void update(String message) {
System.out.println("【短信服务】收到通知:" + message + " → 发送短信");
}
}
// 观察者3:保单生成服务
class PolicyService implements Observer {
@Override
public void update(String message) {
System.out.println("【保单服务】收到通知:" + message + " → 生成电子保单");
}
}
// ==================== 4. 测试 ====================
public class Test {
public static void main(String[] args) {
// 1. 创建被观察者(保单)
PolicySubject subject = new PolicySubject();
// 2. 添加观察者(订阅)
subject.attach(new PayService());
subject.attach(new SmsService());
subject.attach(new PolicyService());
// 3. 状态改变 → 自动通知所有观察者
System.out.println("===== 投保成功,状态变更 =====");
subject.setStatus("投保成功");
}
}
2. 运行结果
plaintext
===== 投保成功,状态变更 =====
【支付服务】收到通知:投保成功 → 开始扣款
【短信服务】收到通知:投保成功 → 发送短信
【保单服务】收到通知:投保成功 → 生成电子保单
3. 代码核心逻辑(你一眼看懂)
-
被观察者(PolicySubject) 状态一变,自动通知所有人 ,不关心谁在监听。
-
观察者(Pay/Sms/PolicyService) 监听状态,收到通知自己做事。
-
解耦 主业务只发通知,加功能只加观察者,不用改原来代码!
4. 和你之前说的对比
普通多任务调用(硬编码)
java
运行
pay();
sms();
createPolicy();
观察者模式(自动通知)
java
运行
setStatus("投保成功");
5. 一句话总结
观察者模式 = 状态一变,自动广播通知,所有订阅者自动执行!
你现在彻底懂了 吧!我可以再给你写一个 SpringBoot 版观察者模式,更贴近你项目!