Skip to main content

观察者模式

观察者模式

  • 观察者模式,也叫发布-订阅模式,是一种一对多的关系,一个对象状态发生改变,所有依赖于它的对象都得到通知并被自动更新。

定义事件

// OrderCreatedEvent.java
public static class OrderCreatedEvent extends ApplicationEvent {

private final String orderId;
private final String userId;

public OrderCreatedEvent(Object source, String orderId, String userId) {
super(source); // source 通常是发布事件的 bean
this.orderId = orderId;
this.userId = userId;
}

// Getters
public String getOrderId() { return orderId; }
public String getUserId() { return userId; }
}

@Data
public static class Item{
private String name;
}

发布事件

    // OrderService.java
@Service
public static class OrderService {

// Spring 自动注入事件发布器
@Autowired
private ApplicationEventPublisher eventPublisher;

public void createOrder(String userId, List<Item> items) {
// 1. 创建订单逻辑
String orderId = saveOrder(userId, items);

// 2. 发布事件! 👈 关键步骤
eventPublisher.publishEvent(
new OrderCreatedEvent(this, orderId, userId)
);

// 后续逻辑...
}

private String saveOrder(String userId, List<Item> items) {
// 保存到数据库
return "ORD-" + System.currentTimeMillis();
}
}

监听器


// EmailNotificationListener.java
@Slf4j
@Component
public static class EmailNotificationListener {

// private static final Logger log = LoggerFactory.getLogger(EmailNotificationListener.class);

// 监听 OrderCreatedEvent 事件
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
log.info("📧 发送邮件通知: 用户 {} 的订单 {} 已创建",
event.getUserId(), event.getOrderId());
// 实际发送邮件逻辑...
}
}

监听器


// SmsNotificationListener.java
@Component
public static class SmsNotificationListener {

@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
System.out.println("📱 发送短信通知: 订单 " + event.getOrderId() + " 已创建");
// 实际发送短信逻辑...
}
}

监听器

    // InventoryUpdateListener.java
@Component
public static class InventoryUpdateListener {

@EventListener
public void updateInventory(OrderCreatedEvent event) {
System.out.println("📦 扣减库存: 处理订单 " + event.getOrderId());
// 扣减商品库存...
}
}

完整代码

@RestController
@SpringBootApplication
public class ObserverApplication {

public static void main(String[] args) {
SpringApplication.run(ObserverApplication.class, args);
}

// OrderCreatedEvent.java
public static class OrderCreatedEvent extends ApplicationEvent {

private final String orderId;
private final String userId;

public OrderCreatedEvent(Object source, String orderId, String userId) {
super(source); // source 通常是发布事件的 bean
this.orderId = orderId;
this.userId = userId;
}

// Getters
public String getOrderId() { return orderId; }
public String getUserId() { return userId; }
}
@Data
public static class Item{
private String name;
}

// OrderService.java
@Service
public static class OrderService {

// Spring 自动注入事件发布器
@Autowired
private ApplicationEventPublisher eventPublisher;

public void createOrder(String userId, List<Item> items) {
// 1. 创建订单逻辑
String orderId = saveOrder(userId, items);

// 2. 发布事件! 👈 关键步骤
eventPublisher.publishEvent(
new OrderCreatedEvent(this, orderId, userId)
);

// 后续逻辑...
}

private String saveOrder(String userId, List<Item> items) {
// 保存到数据库
return "ORD-" + System.currentTimeMillis();
}
}
// EmailNotificationListener.java
@Slf4j
@Component
public static class EmailNotificationListener {

// private static final Logger log = LoggerFactory.getLogger(EmailNotificationListener.class);

// 监听 OrderCreatedEvent 事件
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
log.info("📧 发送邮件通知: 用户 {} 的订单 {} 已创建",
event.getUserId(), event.getOrderId());
// 实际发送邮件逻辑...
}
}
// SmsNotificationListener.java
@Component
public static class SmsNotificationListener {

@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
System.out.println("📱 发送短信通知: 订单 " + event.getOrderId() + " 已创建");
// 实际发送短信逻辑...
}
}
// InventoryUpdateListener.java
@Component
public static class InventoryUpdateListener {

@EventListener
public void updateInventory(OrderCreatedEvent event) {
System.out.println("📦 扣减库存: 处理订单 " + event.getOrderId());
// 扣减商品库存...
}
}

@Resource
OrderService orderService;

@PostMapping("/create-order")
public String createOrder(@RequestBody List<Item> items) {
orderService.createOrder("user-1", items);
return "订单创建成功!";
}

}