长春有几个火车站,广安公司网站建设,wordpress 添加样式表,创业型企业网站模板1.什么是责任链 责任链模式#xff08;Chain of Responsibility Pattern#xff09;是一种行为设计模式#xff0c;它允许多个对象有机会处理请求#xff0c;从而避免请求的发送者和接收者之间的耦合关系。每个收到请求的对象要么处理该请求#xff0c;要么将它传递给链中…1.什么是责任链 责任链模式Chain of Responsibility Pattern是一种行为设计模式它允许多个对象有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。每个收到请求的对象要么处理该请求要么将它传递给链中的下一个对象。
责任链模式的优点 降低耦合度: 发送者无需知道请求的接收者是谁也不需要知道请求如何被处理。接收者也不需要知道其他接收者的存在。 增强给请求的处理灵活性: 可以动态地增删处理者。处理者可以根据条件决定是否处理请求。 简化了对象: 请求的发送者和接收者之间无需建立直接联系。
责任链模式的缺点 可能导致难以调试: 如果链很长可能会导致难以追踪请求的处理过程。 可能不易于维护: 当链的结构变得复杂时维护起来可能比较困难。
2.使用场景 责任链的使用场景还是比较多的 多条件流程判断权限控制 ERP 系统流程审批总经理、人事经理、项目经理 Java 过滤器的底层实现 Filter 多级审批如报销审批、请假申请等。 异常处理不同类型的异常可以被不同的处理者捕获和处理。 过滤器在网络通信中多个过滤器可以处理同一个请求或响应。 如果不使用该设计模式那么当需求有所改变时就会使得代码臃肿或者难以维护例如下面的例子。 3.反例 假设现在又一个审批流程进入下一个审批流程的条件是当前审批流程审批通过 组长审批通过--主管审批通过--项目经理审批通过 那么代码可以这样写 //第一步
public class GroupLeaderHandler {public Boolean handler(){System.out.println(第一步--GroupLeaderHandler);return true;}
}//第二步
public class ManagerHandler {public Boolean handler(){System.out.println(第二步--ManagerHandler);return true;}
}//第三步
public class ProjectManagerHandler {public Boolean handler(){System.out.println(第三步--ProjectManager这是最后一步啦);return true;}
}//客户端
publicclass HandlerClient {public static void main(String[] args) {GroupLeaderHandler groupLeaderHandler new GroupLeaderHandler();ManagerHandler managerHandler new ManagerHandler();ProjectManagerHandler projectManagerHandler new ProjectManagerHandler();boolean groupLeaderFlag groupLeaderHandler.handler();if(groupLeaderFlag){boolean managerFlag managerHandler.handler();if(managerFlag){projectManagerHandler.handler();}}}
}
如果审批的人10个甚至更多我们的代码可能就会写成这样
if(第1步审核通过){// 第2步审核if(第2步审核通过){// 第3步审核if(第3步审核通过){// 第4步审核if(第4步审核通过){// 第5步审核if(第5步审核通过){// 第6步审核if(第6步审核通过){//...}}} }}
} 这种代码不仅冗余并且当我们要将某两关进行调整时对代码的改动非常大这种操作的风险是很高的因此这是一种非常糟糕的写法。
4.使用责任链和工厂进行改造
/*** 审核接口也可以使用抽象类*/
public interface Approver {void handler();void setNextApprover(Approver nextApprover);
}/*** 行政部*/
public class AdministrationDepartment implements Approver{private Approver nextApprover;Overridepublic void handler() {System.out.println(行政部审批通过);if (nextApprover ! null) {nextApprover.handler();}}Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover nextApprover;}
}/*** 财务部*/
public class FinanceDepartment implements Approver{private Approver nextApprover;Overridepublic void handler() {System.out.println(财务部审批通过);if (nextApprover ! null) {nextApprover.handler();}}Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover nextApprover;}
}/*** 总经理*/
public class GeneralManager implements Approver{private Approver nextApprover;Overridepublic void handler() {System.out.println(总经理审批通过);if (nextApprover ! null) {nextApprover.handler();}}Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover nextApprover;}
}/*** 工厂类在工厂类中配置审批流程形成责任链*/
public class ApprovalProcessFactory {public static ListApprover approvers;static {approvers Arrays.asList(new AdministrationDepartment(),new FinanceDepartment(), new GeneralManager(), new CEO());}public static Approver createApprovalProcess() {// 将处理器按顺序链接成责任链for (int i 0; i approvers.size() - 1; i) {approvers.get(i).setNextApprover(approvers.get(i 1));}return approvers.get(0);}
}//测试类
public class ApprovalProcessTest {public static void main(String[] args) {Approver approvalProcess ApprovalProcessFactory.createApprovalProcess();approvalProcess.handler();}
}