交友免费的网站建设,网站做代理需要空间是多少钱,奇葩网站100个,网站动态画面用啥做1. 什么是责任链模式
责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下#xff1a;
避免将一个请求的发送者与接收者耦合在一起#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链#xff0c;并且沿着这条链传递请求
避免将一个请求的发送者与接收者耦合在一起让多个对象都有机会处理请求。将接收请求的对象连接成一条链并且沿着这条链传递请求直到有一个对象能够处理它为止。
2. 责任链模式的作用
将请求和请求的处理进行解耦提高代码的可扩展性。
3. 责任链模式的结构 责任链模式主要包含以下角色
抽象处理者Handler角色定义一个处理请求的接口包含抽象处理方法和一个后继连接(链上的每个处理者都有一个成员变量来保存对于下一处理者的引用)。具体处理者Concrete Handler角色实现抽象处理者的处理方法判断能否处理本次请求如果可以处理请求则处理否则将该请求转给它的后继者。客户类Client角色创建处理链并向链头的具体处理者对象提交请求它不关心处理细节和请求的传递过程。
在实际开发中责任链模式可能会增加一个责任链管理者来管理具体的处理者。
4. 责任链模式在实际开发中的应用
在 SpringBoot 中责任链模式的实践方式有多种以下是一种示例一个下单流程的多个独立检查逻辑。
4.1 实现方式1
创建 Pojo, 下单对象
public class OrderContext {private String seqId;private String userId;private Long skuId;private Integer amount;private String userAddressId;// Getters and setters
}创建处理者接口
public interface OrderHandleIntercept {int sort();OrderContext handle(OrderContext context);
}创建具体处理者类
Component
public class RepeatOrderHandleInterceptService implements OrderHandleIntercept {Overridepublic int sort() {return 1; // 执行顺序为 1}Overridepublic OrderContext handle(OrderContext context) {System.out.println(通过seqId,检查客户是否重复下单);return context;}
}Component
public class ValidOrderHandleInterceptService implements OrderHandleIntercept {Overridepublic int sort() {return 2; // 执行顺序为 2}Overridepublic OrderContext handle(OrderContext context) {System.out.println(检查请求参数是否合法,并且获取客户的银行账户);return context;}
}Component
public class BankOrderHandleInterceptService implements OrderHandleIntercept {Overridepublic int sort() {return 3; // 执行顺序为 3}Overridepublic OrderContext handle(OrderContext context) {System.out.println(检查银行账户是否合法调用银行系统检查银行账户余额是否满足下单金额);return context;}
}处理器链类
Component
public class OrderHandleChainService implements ApplicationContextAware {private ListOrderHandleIntercept handleList new ArrayList();Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {MapString, OrderHandleIntercept serviceMap applicationContext.getBeansOfType(OrderHandleIntercept.class);handleList serviceMap.values().stream().sorted(Comparator.comparing(OrderHandleIntercept::sort)).collect(Collectors.toList());}public OrderContext execute(OrderContext context) {for (OrderHandleIntercept handleIntercept : handleList) {context handleIntercept.handle(context);}return context;}
}进行单元测试
Autowired
private OrderHandleChainService orderHandleChainService;Test
public void test02() {orderHandleChainService.execute(new OrderContext());
}执行结果
通过seqId,检查客户是否重复下单
检查请求参数是否合法,并且获取客户的银行账户
检查银行账户是否合法调用银行系统检查银行账户余额是否满足下单金额4.2 实现方式2
通过注解 Order 来指定排序
Order(1)
Component
public class RepeatOrderHandleInterceptService implements OrderHandleIntercept {//...省略
}Order(2)
Component
public class ValidOrderHandleInterceptService implements OrderHandleIntercept {//...省略
}Order(3)
Component
public class BankOrderHandleInterceptService implements OrderHandleIntercept {//...省略
}修改 OrderHandleChainService
Component
public class OrderHandleChainService {Autowiredprivate ListOrderHandleIntercept handleList;public OrderContext execute(OrderContext context) {for (OrderHandleIntercept handleIntercept : handleList) {context handleIntercept.handle(context);}return context;}
}4.3 实现方式3
通过定义抽象类来实现责任链设计模式
public abstract class AbstractOrderHandle {private AbstractOrderHandle next;public AbstractOrderHandle getNext() {return next;}public void setNext(AbstractOrderHandle next) {this.next next;}public abstract OrderContext handle(OrderContext orderContext);public OrderContext execute(OrderContext context) {context handle(context);if (getNext() ! null) {getNext().execute(context);}return context;}
}分别创建处理类
Component
Order(1)
public class RepeatOrderHandle extends AbstractOrderHandle {Overridepublic OrderContext handle(OrderContext context) {System.out.println(通过seqId检查客户是否重复下单);return context;}
}Component
Order(2)
public class ValidOrderHandle extends AbstractOrderHandle {Overridepublic OrderContext handle(OrderContext context) {System.out.println(检查请求参数是否合法并且获取客户的银行账户);return context;}
}Component
Order(3)
public class BankOrderHandle extends AbstractOrderHandle {Overridepublic OrderContext handle(OrderContext context) {System.out.println(检查银行账户是否合法调用银行系统检查银行账户余额是否满足下单金额);return context;}
}创建一个责任链管理器
Component
public class OrderHandleManager {Autowiredprivate ListAbstractOrderHandle orderHandleList;PostConstructpublic void initChain() {int size orderHandleList.size();for (int i 0; i size; i) {if (i size - 1) {orderHandleList.get(i).setNext(null);} else {orderHandleList.get(i).setNext(orderHandleList.get(i 1));}}}public OrderContext execute(OrderContext context) {OrderContext execute orderHandleList.get(0).execute(context);return context;}
}测试
Autowired
private OrderHandleManager orderHandleManager;Test
public void test02() {orderHandleManager.execute(new OrderContext());
}运行结果与预期一致
通过seqId检查客户是否重复下单
检查请求参数是否合法并且获取客户的银行账户
检查银行账户是否合法调用银行系统检查银行账户余额是否满足下单金额5. 职责链模式总结
职责链模式Chain of Responsibility Pattern是一种行为设计模式它允许多个对象处理同一个请求从而避免请求的发送者和接收者之间的耦合关系。这种模式为请求的处理提供了一条清晰的链每个对象可以决定是否处理该请求或者将请求转发给链中的下一个对象。
职责链模式的优点
降低耦合度发送者和接收者之间没有直接的联系降低了系统组件之间的耦合度。增强灵活性可以在运行时动态地添加或移除职责链中的处理对象提高了系统的灵活性和可扩展性。明确责任分配每个处理对象只关注自己的职责范围责任分配更加明确。
职责链模式的缺点
请求处理不确定性不能保证请求一定会被处理如果链中的所有对象都不处理请求请求将被忽略。系统性能影响请求可能需要通过较长的链进行传递可能会对性能产生影响。客户端复杂性增加客户端可能需要了解整个职责链的配置增加了客户端的使用复杂性。
职责链模式的使用场景
多个对象处理请求当一个请求需要多个对象依次处理时可以使用职责链模式。处理逻辑不明确在运行时根据请求的类型动态选择处理对象不希望客户端知道具体的处理逻辑。
职责链模式的实现可以通过组合多个具体处理者对象并设置它们的后继者形成一个处理链。当请求发出时链中的每个对象依次判断是否能够处理该请求如果可以处理则执行处理操作否则将请求转发给链中的下一个对象。
这种模式在实际应用中非常广泛例如在GUI应用程序的事件处理、工作流审批流程、过滤器链等场景中都有应用。通过使用职责链模式可以提高系统的模块化和灵活性同时降低组件之间的依赖关系。