章
目
录
本文主要讲解关于责任链模式案例详解相关内容,让我们来一起学习下吧!
概念:责任链模式是一种行为设计模式,就是我们可以构建一个处理请求的处理链,每一个处理器依次处理请求,直到该请求被处理完毕
优点
两个方面:
- 可以将请求发送者和接收者解耦,就是请求发送者不需要知道是谁处理的最终结果,增强了系统的灵活性和可扩展性
- 可以动态地添加、删除和调整处理者对象,从而灵活地构建处理链
购票代码重构
对于列车购票接口进行重构
定义抽象责任链组件
/**
* 抽象业务责任链组件
*
*/
public interface AbstractChainHandler<T> extends Ordered {
/**
* 执行责任链逻辑
*
* @param requestParam 责任链执行入参
*/
void handler(T requestParam);
/**
* @return 责任链组件标识
*/
String mark();
}
这段代码中定义了两个抽象方法,其中一个来执行责任链逻辑,一个来返回责任链组件标识,用来标记和区分不同的责任链处理器,然后它继承了Ordered接口,Ordered
接口中定义了一个 getOrder
方法,返回一个整数值,表示组件的执行顺序
为什么要继承ordered
接口
在Spring容器中,通过自动扫描并识别实现了Ordered
接口的组件,Spring会根据这些组件的执行顺序构建责任链。数值小的组件具有更高的执行优先级,因此它们会在责任链中的数值较大的组件之前执行。
定义购买车票过滤器
/**
* 列车购买车票过滤器
*
*/
public interface TrainPurchaseTicketChainFilter<T extends PurchaseTicketReqDTO> extends AbstractChainHandler<PurchaseTicketReqDTO> {
@Override
default String mark() {
return TicketChainMarkEnum.TRAIN_PURCHASE_TICKET_FILTER.name();
}
}
这段代码定义了一个接口 TrainPurchaseTicketChainFilter
,它继承了抽象业务责任链组件
<T extends PurchaseTicketReqDTO>
是一个泛型约束,表明该接口的实现类必须是PurchaseTicketReqDTO
及其子类
实现购票逻辑接口
/**
* 购票流程过滤器之验证参数必填
*
*/
@Component
public class TrainPurchaseTicketParamNotNullChainHandler implements TrainPurchaseTicketChainFilter<PurchaseTicketReqDTO> {
@Override
public void handler(PurchaseTicketReqDTO requestParam) {
// ......
}
@Override
public int getOrder() {
return 0;
}
}
/**
* 购票流程过滤器之验证参数是否有效
* 验证参数有效这个流程会大量交互缓存,为了优化性能需要使用 Lua。为了方便大家理解流程,这里使用多次调用缓存
*
*/
@Component
@RequiredArgsConstructor
public class TrainPurchaseTicketParamVerifyChainHandler implements TrainPurchaseTicketChainFilter<PurchaseTicketReqDTO> {
private final TrainMapper trainMapper;
private final TrainStationMapper trainStationMapper;
private final DistributedCache distributedCache;
@Override
public void handler(PurchaseTicketReqDTO requestParam) {
// ......
}
@Override
public int getOrder() {
return 10;
}
}
/**
* 购票流程过滤器之验证列车站点库存是否充足
*
*/
@Component
@RequiredArgsConstructor
public class TrainPurchaseTicketParamStockChainHandler implements TrainPurchaseTicketChainFilter<PurchaseTicketReqDTO> {
private final SeatMarginCacheLoader seatMarginCacheLoader;
private final DistributedCache distributedCache;
@Override
public void handler(PurchaseTicketReqDTO requestParam) {
// ......
}
@Override
public int getOrder() {
return 20;
}
}
/**
* 购票流程过滤器之验证乘客是否重复购买
*
*/
@Component
@RequiredArgsConstructor
public class TrainPurchaseTicketRepeatChainHandler implements TrainPurchaseTicketChainFilter<PurchaseTicketReqDTO> {
@Override
public void handler(PurchaseTicketReqDTO requestParam) {
// ......
}
@Override
public int getOrder() {
return 30;
}
}
总结
可以看到,最终的实现购票逻辑的接口需要继承TrainPurchaseTicketChainFilter
购买车票过滤器接口、
TrainPurchaseTicketChainFilter
则需要继承AbstractChainHandler
接口,是一个层层继承的关系
由抽象到具体一步步细分,从而来实现业务逻辑,实际使用中可以直接把对应的请求参数丢给责任链处理器去完成
责任链模式相对来说不是难理解,只要稍微用心整理一下就会豁然开朗
以上就是关于责任链模式案例详解相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!