一 场景
想象一个求职过程:
(1)求职者(Client)提交简历给机器进行第一次筛选,筛选成功后提交给主管。
(2)主管进行一轮面试,对简历再次评级,拒绝评级差的,评级好的提交给经理。
(3)经理进行二轮面试,对简历再次评级,拒绝评级差的,评级好的提交给总监。
(4)总监进行三轮面试,对简历再次评级,拒绝评级差的,评级好的通过面试(hr面暂时免了)。
二 代码
对上述场景进行模拟的代码,当然你可以用一系列if和else去模拟这个场景,但是那样的话代码会很难看,耦合太强,太乱。。。所以我模仿责任链写了:
抽象处理类:
public abstract class Handler { protected Handler successor=null; public Handler getSuccessor(){ return successor; } public void setSuccessor(Handler successor){ this.successor=successor; } public abstract String handleResume(String name, String level); }
主管处理类:
经理处理类:public class SupervisorHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="C";//主管进行一轮面试重新评定简历等级,简单起见评定为A if(newLevel.equals("D")){ result+=name+"已被回绝"; } else{ if(getSuccessor()!=null){ return getSuccessor().handleResume(name, newLevel); } } return result; } }
总监处理类:public class ManagerHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="A";//部门经理二轮面试重新评定等级 if(newLevel.equals("C")){ result+=name+"已被回绝"; } else{ if(getSuccessor()!=null){ return getSuccessor().handleResume(name, newLevel); } } return result; } }
客户类:public class ChiefHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="A";//总监进行三轮面试评定等级 if(newLevel.equals("A")){ result+=name+",恭喜你通过面试!"; } else { result+=name+"已被回绝"; } return result; } }
public class Client { public static void main(String[] args){ Handler chief=new ChiefHandler(); Handler manager=new ManagerHandler(); Handler supervisor=new SupervisorHandler(); supervisor.setSuccessor(manager); manager.setSuccessor(chief); //简历通过机器筛选并评定为A String result=supervisor.handleResume("xiaoming", "D"); System.out.println(result); } }
三 相关理论
3.1定义
看了实际的应用场景和代码,责任链已经不难理解了,是时候看看理论定义了,百度百科如是说:责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
3.2纯与不纯的责任链
纯的责任链模式要求一个具体的处理者对象只能有两个行为:要么承担责任,要么把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。并且一个请求必须被某一个处理者对象所接收; 不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。 纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。
四 该模式包含的角色
4.1抽象处理者角色(Handler)
定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
4.2具体处理者角色(ConcreteHandler)
具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
4.3客户类
需要指定怎么链。可以跳过某一链,还可以越级。
五 为何要责任链
5.1 改变内部的传递规则
在内部,超级优秀的简历直接给总监就好。
5.2 可以从职责链任何一关开始
主管离职了,简历直接由经理筛选吧。
5.3总结一下
不用职责链的结构,client需要和公司中的每一个层级都发生耦合关系。 反映在代码上就是我们需要在一个类中去写上很多的if….else语句。 用了职责链,只需要认识其中的一个层级,然后让让他处理或者传递给其他层级就好。