说说你对责任链模式的理解?
1 个回答
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。小洋责任链模式是一种行为设计模式,其主要思想是将请求沿着一条链传递,链中的每一个节点都是一个对象,每个节点负责处理不同的请求。节点对象内部会自动维护一个指向下一个节点的引用,当一个请求发出时,沿着链传递直到某个节点处理这个请求为止。 #### 优点 1. **解耦请求与处理**:请求发送者与处理者解耦,发送者不需要知道具体的处理者,只需将请求发出即可。 2. **处理者专注于自身的职责**:每个节点只需关注自己负责的请求类型,不感兴趣的请求直接传递给下一个节点。 3. **链式传递**:具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。 4. **灵活的链路结构**:可以通过改变链路结构动态地新增或删减责任。 5. **易于扩展**:符合开闭原则,便于扩展新的请求处理类(节点)。 #### 缺点 1. **链路过长影响效率**:责任链过长时,可能对请求传递处理效率有影响。 2. **循环引用导致死循环**:如果节点对象存在循环引用,可能会造成死循环,导致系统崩溃。 #### 生活中的例子 在公司内部发起一个OA审批流程时,依次由项目经理审批、部门经理审批、老板审批和人力审批,这就是责任链模式的一个典型例子。每个角色的职责不同,责任链通过各个节点角色处理请求。 #### 示例代码 ```java // 抽象处理者 abstract class Approver { protected Approver nextApprover; public void setNextApprover(Approver nextApprover) { this.nextApprover = nextApprover; } public abstract void processRequest(int amount); } // 具体处理者:项目经理 class ProjectManager extends Approver { @Override public void processRequest(int amount) { if (amount <= 1000) { System.out.println("项目经理审批通过,金额:" + amount); } else if (nextApprover != null) { nextApprover.processRequest(amount); } } } // 具体处理者:部门经理 class DepartmentManager extends Approver { @Override public void processRequest(int amount) { if (amount <= 5000) { System.out.println("部门经理审批通过,金额:" + amount); } else if (nextApprover != null) { nextApprover.processRequest(amount); } } } // 具体处理者:老板 class Boss extends Approver { @Override public void processRequest(int amount) { if (amount <= 10000) { System.out.println("老板审批通过,金额:" + amount); } else { System.out.println("金额太大,无人审批!"); } } } // 测试类 public class ChainOfResponsibilityDemo { public static void main(String[] args) { Approver projectManager = new ProjectManager(); Approver departmentManager = new DepartmentManager(); Approver boss = new Boss(); // 设置责任链 projectManager.setNextApprover(departmentManager); departmentManager.setNextApprover(boss); // 发起请求 projectManager.processRequest(800); // 项目经理审批通过 projectManager.processRequest(3000); // 部门经理审批通过 projectManager.processRequest(7000); // 老板审批通过 projectManager.processRequest(15000); // 金额太大,无人审批 } } ``` ### 责任链模式在实际应用中的例子 **SpringMVC中的拦截器** SpringMVC使用责任链模式来实现请求拦截,多个拦截器可以按照顺序对请求进行处理,每个拦截器处理后可以选择继续传递请求或终止请求。 **MyBatis中的插件机制** MyBatis中的插件机制也是典型的责任链模式应用,多个插件可以按照顺序对SQL操作进行处理,每个插件处理后可以选择继续传递操作或终止操作。 通过责任链模式,可以有效地解耦请求发送者和处理者,灵活地处理复杂的业务流程,并且方便系统扩展和维护。发布于 2024-08-08 20:20 •IP属地 安徽举报评论收藏
公众号进入网站体验更佳

