简介
说明
本文用示例介绍观察者模式的写法:Spring事件。
Spring事件和传统观察者模式的概念的区别
| 传统观察者模式 | Spring事件 |
| 主题 | 事件 |
| 观察者 | 监听器 |
优缺点
优点
- 策略类会自动注册,无需手动注册策略类。
- 可以方便地指定观察者的执行顺序。(观察者模式一般不需要指定顺序,但可以指定当然更好啦!)
缺点
无
实战
本处使用一个贴近真实场景的案例:订单取消时,要有一系列操作,比如:账户业务需要给用户退钱、库存业务需要给商品退回数量。
在这个场景中,取消订单就是事件,账户业务和库存业务是监听器。
项目结构:

下载源码
此内容仅限VIP查看,请先登录
测试
测试类
package com.knife.designPattern.controller;
import com.knife.designPattern.publisher.EventPublisher;
import com.knife.designPattern.bo.CancelOrderBO;
import com.knife.designPattern.event.CancelOrderEvent;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "订单")
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private EventPublisher eventPublisher;
@ApiOperation("取消订单")
@PostMapping("cancel")
public String cancel(@RequestBody CancelOrderBO cancelOrderBO) {
eventPublisher.publish(new CancelOrderEvent(cancelOrderBO));
return "success";
}
}
访问接口
启动项目后,访问Knife4j(接口文档)的地址:http://localhost:8080/doc.html
(当然,你用postman也完全可以)

结果
库存业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255) 账户业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255)
注意事项
此方法要慎用!因为它有坑,详见:Spring Event-踩坑(注意事项) – 自学精灵

请先 !