责任链定义
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链使用场景
责任链有很多的使用场景 但是最适合用的还是重构存在很多使用if-else判断逻辑的代码
责任链模式分析及实现
这里我使用集成支付场景进行说明
首先先确定需求 需要通过传入的支付方式代码确定是支付宝支付还是微信支付,所以我们先抽象出一个支付类
抽象一个支付对象(也可以是接口)
@Data
public abstract class AbstractPay {
/**
* 支付宝支付
*/
public static int ALI_PAY = 1;
/**
* 微信支付
*/
public static int WX_PAY = 2;
/**
* 条码支付
*
* @param payRequest
* @param abstractPay
*/
abstract protected void barCode(PayRequest payRequest, AbstractPay abstractPay);
}
实现责任链管理类
@Slf4j
public class PayChain extends AbstractPay {
/**
* 完整责任链列表
*/
private List<AbstractPay> list = new ArrayList<>();
/**
* 索引
*/
private int index = 0;
/**
* 添加责任对象
*
* @param abstractPay
* @return
*/
public PayChain add(AbstractPay abstractPay) {
list.add(abstractPay);
return this;
}
@Override
public void barCode(PayRequest payRequest, AbstractPay abstractPay) {
// 所有遍历完了,直接返回
if (index == list.size()) {
log.error("不存在的支付方式");
return;
}
// 获取当前责任对象
AbstractPay current = list.get(index);
// 修改索引值,以便下次回调获取下个节点,达到遍历效果
index++;
// 调用当前责任对象处理方法
current.barCode(payRequest, this);
}
}
实现支付宝支付
public class AliPay extends AbstractPay {
@Override
public void barCode(PayRequest payRequest, AbstractPay abstractPay) {
if (payRequest.getPayCode() == ALI_PAY) {
System.out.println("支付宝扫码支付");
} else {
abstractPay.barCode(payRequest, abstractPay);
}
}
}
实现微信支付
public class WxPay extends AbstractPay {
@Override
public void barCode(PayRequest payRequest, AbstractPay abstractPay) {
if (payRequest.getPayCode() == WX_PAY) {
System.out.println("微信扫码支付");
} else {
abstractPay.barCode(payRequest, abstractPay);
}
}
}
测试责任链
@SpringBootTest
class EasysdkApplicationTests {
@Test
void barCode() {
PayRequest payRequest = new PayRequest();
payRequest.setPayCode(2);
PayChain chain = new PayChain();
chain.add(new AliPay()).add(new WxPay());
chain.barCode(payRequest, chain);
}
}
此篇文章参考责任链模式妙用