参考:https://www.cnblogs.com/LOVE0612/p/10925314.html
==================================================================================================================================
模式:责任链(Chain of Responsibility)。
属性:行为模式。
概述:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。
目的:通过这种方式去除对象之间的耦合,设计模式的作用之一就是解决对象之间的耦合,这个必须要说一下,否则你决定很多的时候,设计模式是脱了裤子放屁。
解决问题:当前处理者处理自己的职能范围的问题,如果处理不了,传递给下一个处理者,形成链条。从业务上理解(再次强调是业务上理解),工作流或者常见的审批流非常相似。举例如果一个小型的公司普通员工、有主管、部门经理、总经理。如果普通员工请假,1天之内的主管可以审批;3天之内的部门经理审批;超过3天的,需要总经理审批。这样的设计场景中,适合责任链模式。
角色:如何实现上述的业务逻辑呢
A、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。对应上边例子中的“人”(含主管、部门经理,总经理,统一定位为“人”)
B、具体处理者(Concrete Handler)备注1角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。对应上边例子具体的人,也就是具体实现。
C、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。个人觉的,是调用的开始点。
应用场景:下次再总结。
开源软件实现的例子:下次再总结。
实现例子:
A:抽象处理者(Handler)角色
1 package comm.design; 2 3 /** 4 * 是一个公司管理者的接口,假设每天的工作为处理请假。 5 * @author yangzhancheng 6 * 7 */ 8 public interface IManagerHandler { 9 10 /** 11 * 要处理的任务(请假) 12 */ 13 public void doLeave(int leaveDays); 14 15 /** 16 * 下一位处理者 17 * @param managerHandler 18 */ 19 public void nextManagerHandler(IManagerHandler managerHandler); 20 }
B:具体处理者(Concrete Handler)--主管
1 package comm.design; 2 3 /** 4 * 主管 5 * @author yangzhancheng 6 * 7 */ 8 public class ExecutiveManageHandler implements IManagerHandler { 9 10 private IManagerHandler managerHandler; 11 12 @Override 13 public void doLeave(int leaveDays) { 14 if(leaveDays<=1){ 15 System.out.println("我是主管理,同意请假,请假天数:"+leaveDays); 16 }else{ 17 //下一个级处理 18 System.out.println("我是主管,需要请示上级。"); 19 managerHandler.doLeave(leaveDays); 20 } 21 } 22 23 @Override 24 public void nextManagerHandler(IManagerHandler managerHandler) { 25 this.managerHandler = managerHandler; 26 } 27 28 }
B:具体处理者(Concrete Handler)--部门经理
1 package comm.design; 2 3 /** 4 * 部门经理 5 * @author yangzhancheng 6 * 7 */ 8 public class DirectorManageHandler implements IManagerHandler { 9 10 private IManagerHandler managerHandler; 11 12 @Override 13 public void doLeave(int leaveDays) { 14 if(leaveDays<=3){ 15 System.out.println("我是部门经理,同意请假,请假天数:"+leaveDays); 16 }else{ 17 //下一个级处理 18 System.out.println("我是部门经理,需要请示上级。"); 19 managerHandler.doLeave(leaveDays); 20 } 21 } 22 23 24 @Override 25 public void nextManagerHandler(IManagerHandler managerHandler) { 26 this.managerHandler = managerHandler; 27 } 28 29 }
B:具体处理者(Concrete Handler)--总经理
1 package comm.design; 2 3 /** 4 * 总经理 5 * @author yangzhancheng 6 * 7 */ 8 public class GeneralManageHandler implements IManagerHandler { 9 10 private IManagerHandler managerHandler; 11 12 @Override 13 public void doLeave(int leaveDays) { 14 System.out.println("我是总经理,同意请假,请假天数:"+leaveDays); 15 } 16 17 @Override 18 public void nextManagerHandler(IManagerHandler managerHandler) { 19 this.managerHandler = managerHandler; 20 } 21 22 }
C:客户类(Client)角色
1 package comm.design; 2 3 /** 4 * 调用类,注意不要死循环 5 * @author yangzhancheng 6 * 7 */ 8 public class Client { 9 10 public static void main(String[] args) { 11 12 //主管 13 IManagerHandler executiveManageHandler = new ExecutiveManageHandler(); 14 //部门经理 15 IManagerHandler directorManageHandler = new DirectorManageHandler(); 16 //经理 17 IManagerHandler generalManageHandler = new GeneralManageHandler(); 18 19 //主管的领导是部门经理 20 executiveManageHandler.nextManagerHandler(directorManageHandler); 21 //部门经理的领导是经理 22 directorManageHandler.nextManagerHandler(generalManageHandler); 23 24 //员工请5天假期 25 executiveManageHandler.doLeave(5); 26 } 27 28 }
运行结果
我是主管,需要请示上级。
我是部门经理,需要请示上级。
我是总经理,同意请假,请假天数:5
总结:下次再补充。
备注1:这个英文不知道对不对,看大部分文章这么些,有时间再研究对不对。
原文:https://www.cnblogs.com/fating/p/12319826.html