观察者模式(Observer Pattern)

观察者模式(Observer Pattern) 是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,所有依赖于它的观察者都会自动收到通知并更新。

🎯 核心思想:"广播通知"机制 ------ 主题一变,全体感知

java 复制代码
/**
 * 订单观察者接口
 * 定义观察者的统一行为
 */
public interface OrderObserver {
    /**
     * 当订单状态改变时被调用
     *
     * @param orderId 订单ID
     * @param status 新的订单状态
     */
    void update(String orderId, String status);
}
java 复制代码
/**
 * 邮件通知观察者
 * 当订单状态变化时发送邮件通知
 */
public class EmailNotificationObserver implements OrderObserver {
    
    @Override
    public void update(String orderId, String status) {
        System.out.println("📧 Email通知: 订单 " + orderId + " 状态已更新为 " + status + 
                          ",系统已发送邮件至客户邮箱");
    }
}
java 复制代码
/**
 * 短信通知观察者
 * 当订单状态变化时发送短信通知
 */
public class SmsNotificationObserver implements OrderObserver {
    
    @Override
    public void update(String orderId, String status) {
        System.out.println("📱 SMS通知: 订单 " + orderId + " 状态已更新为 " + status + 
                          ",客户将收到短信提醒");
    }
}
java 复制代码
/**
 * 仓储系统观察者
 * 当订单状态变为CONFIRMED时触发库存扣减
 */
public class WarehouseObserver implements OrderObserver {
    
    @Override
    public void update(String orderId, String status) {
        if ("CONFIRMED".equals(status)) {
            System.out.println("🏭 仓储系统: 订单 " + orderId + " 已确认,正在处理商品出库...");
        } else if ("SHIPPED".equals(status)) {
            System.out.println("🚚 仓储系统: 订单 " + orderId + " 已发货,物流系统已对接");
        }
    }
}
java 复制代码
import java.util.ArrayList;
import java.util.List;

/**
 * 订单主题 - 被观察者
 * 当订单状态发生变化时,通知所有注册的观察者
 */
public class OrderSubject {
    private final List<OrderObserver> observers = new ArrayList<>();
    private String orderStatus;
    private String orderId;

    public OrderSubject(String orderId) {
        this.orderId = orderId;
        this.orderStatus = "CREATED";
    }

    /**
     * 添加观察者
     */
    public void attach(OrderObserver observer) {
        observers.add(observer);
    }

    /**
     * 移除观察者
     */
    public void detach(OrderObserver observer) {
        observers.remove(observer);
    }

    /**
     * 通知所有观察者
     */
    private void notifyObservers() {
        for (OrderObserver observer : observers) {
            observer.update(orderId, orderStatus);
        }
    }

    /**
     * 更新订单状态
     */
    public void setOrderStatus(String status) {
        this.orderStatus = status;
        notifyObservers();
    }

    public String getOrderStatus() {
        return orderStatus;
    }

    public String getOrderId() {
        return orderId;
    }
}
java 复制代码
/**
 * 观察者模式演示程序 - 模拟电商订单系统的状态通知场景
 */
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建订单主题(被观察者)
        OrderSubject order = new OrderSubject("ORD123456789");

        // 创建各类观察者
        OrderObserver smsObserver = new SmsNotificationObserver();
        OrderObserver emailObserver = new EmailNotificationObserver();
        OrderObserver warehouseObserver = new WarehouseObserver();

        // 注册观察者
        order.attach(smsObserver);
        order.attach(emailObserver);
        order.attach(warehouseObserver);

        System.out.println("🚀 开始演示订单系统观察者模式");
        System.out.println("📦 创建新订单: " + order.getOrderId());
        System.out.println("---");

        // 模拟订单状态流转
        System.out.println("1. 订单支付成功:");
        order.setOrderStatus("PAID");
        System.out.println("---");

        System.out.println("2. 订单确认:");
        order.setOrderStatus("CONFIRMED");
        System.out.println("---");

        System.out.println("3. 订单发货:");
        order.setOrderStatus("SHIPPED");
        System.out.println("---");

        System.out.println("4. 订单完成:");
        order.setOrderStatus("COMPLETED");
        System.out.println("---");

        // 演示移除观察者
        System.out.println("5. 移除短信通知,更新状态:");
        order.detach(smsObserver);
        order.setOrderStatus("DELIVERED");
        System.out.println("---");

        System.out.println("✅ 观察者模式演示完成");
    }
}
相关推荐
阿星AI工作室19 小时前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||5 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智6 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香6 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式