观察者模式

  1. 完整代码(直接复制运行)

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. 代码核心逻辑(你一眼看懂)

  1. 被观察者(PolicySubject) 状态一变,自动通知所有人 ,不关心谁在监听。

  2. 观察者(Pay/Sms/PolicyService) 监听状态,收到通知自己做事。

  3. 解耦 主业务只发通知,加功能只加观察者,不用改原来代码!


4. 和你之前说的对比

普通多任务调用(硬编码)

java

运行

复制代码
pay();
sms();
createPolicy();

观察者模式(自动通知)

java

运行

复制代码
setStatus("投保成功");

5. 一句话总结

观察者模式 = 状态一变,自动广播通知,所有订阅者自动执行!

你现在彻底懂了 吧!我可以再给你写一个 SpringBoot 版观察者模式,更贴近你项目!

相关推荐
艺杯羹16 小时前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议
csdn_aspnet1 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
没差c2 天前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
光谱SpectrAI2 天前
Claude Code 2.1.318 的隐私模块:4 条命令,拦了 2 条
windows
Hello_Pyhx2 天前
NWinfo 导出 Windows 硬件信息:从 JSON 报告到缺项排查
windows·json
百事牛科技3 天前
Excel的三种密码:防看、防存、防乱改,各管各的
windows·excel
the3clipse4 天前
MPC-HC 下载安装与最佳配置教程:免费开源、轻量无广告、支持 4K 硬解的 Windows 播放器
windows·播放器·安装教程·硬件加速·mpc-hc·字幕设置·lav filters
独隅4 天前
WebStorm Windows 版 React / Next.js 实战替换指南
javascript·windows·webstorm
陈工大模型4 天前
2026年11月最新免费解压软件横评:7-Zip 、 Win解压缩名列前茅
windows·软件工程·7-zip·压缩软件
中二骚年5 天前
Windows 安全中心 / 防火墙故障,calc和Microsoft Store,终端(管理员)无法正常打开。 原因 + 修复方案
windows·安全·microsoft