责任链模式
什么是责任链模式?
责任链模式 是一种 行为型设计模式(Behavioral Design Pattern),它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象被连接成一条链,请求沿着这条链传递,直到有一个对象处理它为止。
核心思想:
将请求的发送者和接收者解耦,让多个对象都有机会处理请求
角色组成
角色 | 说明 |
---|---|
Handler(抽象处理者) | 定义处理请求的接口,通常包含一个指向下一个处理者的引用 |
ConcreteHandler(具体处理者) | 链条上的每个节点。实现处理逻辑,决定是处理请求还是转发给下一个处理者。 |
Client(客户端) | 组装链条。创建处理链,并向链头发送请求 |
示例:
抽象处理者
java
public interface BaseChainHandler {
void setNextHandler(BaseChainHandler nextHandler);
void handle(Order order);
}
具体处理者
java
public class CouponHandler implements BaseChainHandler {
private BaseChainHandler nextHandler;
@Override
public void setNextHandler(BaseChainHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handle(Order order) {
// 优惠卷逻辑处理
List<Long> couponIds = order.getCouponIds();
Optional.ofNullable(couponIds)
.ifPresent(ids -> couponIds.forEach(couponId -> {
// 假设每个优惠卷减5元
order.setAmount(order.getAmount().subtract(new BigDecimal("5")));
}));
Optional.ofNullable(nextHandler)
.ifPresent(handler -> handler.handle(order));
}
}
java
public class FullDiscountHandler implements BaseChainHandler{
private BaseChainHandler nextHandler;
@Override
public void setNextHandler(BaseChainHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handle(Order order) {
// 满减逻辑处理
BigDecimal amount = order.getAmount();
if(amount.compareTo(new BigDecimal("100")) >= 0) {
// 满100元减10元
order.setAmount(amount.subtract(new BigDecimal("10")));
}
Optional.ofNullable(nextHandler)
.ifPresent(handler -> handler.handle(order));
}
}
java
public class MemberHandler implements BaseChainHandler {
private BaseChainHandler nextHandler;
@Override
public void setNextHandler(BaseChainHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handle(Order order) {
// 判断是否为会员
Long userId = order.getUserId();
BigDecimal amount = order.getAmount();
if (userId == 1L) {
// 会员享受9折优惠
BigDecimal multiply = amount.multiply(new BigDecimal("0.9"));
order.setAmount(multiply);
}
// 继续处理下一个处理器
Optional.ofNullable(nextHandler)
.ifPresent(handler -> handler.handle(order));
}
}
Client(客户端)
java
public class Client {
public static void main(String[] args) {
// 创建订单
Order order = new Order();
order.setOrderId(1L);
order.setUserId(1L);
order.setAmount(new BigDecimal("150"));
order.setStatus("PENDING");
// 创建处理链
BaseChainHandler fullDiscountHandler = new FullDiscountHandler();
BaseChainHandler couponHandler = new CouponHandler();
BaseChainHandler memberHandler = new MemberHandler();
// 设置处理链
fullDiscountHandler.setNextHandler(couponHandler);
couponHandler.setNextHandler(memberHandler);
// 开始处理订单
fullDiscountHandler.handle(order);
// 输出处理后的订单信息
System.out.println("订单ID: " + order.getOrderId());
System.out.println("用户ID: " + order.getUserId());
System.out.println("处理后的金额: " + order.getAmount());
}
}
流程:
FullDiscountHandler(满减处理)->CouponHandler(优惠卷处理)->MemberHandler(会员处理)