观察者模式(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("✅ 观察者模式演示完成");
}
}