责任链模式
责任链模式主要包含以下角色。
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
Handler的实现可以有多个,比如请假场景
Handler的实现直线领导可以批一天假
Handler的实现项目经理可以批三天假
Handler的实现Boss可以批七天假
然后把这三个角色串成一个链表结构,用户只需往第一个节点发送请求,由节点做条件判断和传递到下一个结点,最终得到请假结果,用户无需关心事情最后被谁处理了
再有更高级别人审批假期的话,只需要增加一个角色,添加到责任链即可,原先的代码不动,符合开闭原则
抽象处理者(Handler):以链表的数据结构形式存在,抽象出处理请求的方法,可以有多个实现
public abstract class Handler { public Handler handler; public Handler getNext() { return handler; } public void setNext(Handler handler) { this.handler = handler; } /** * 处理请求的方法 */ public abstract void resRequest(int days); }
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断请求的处理条件和下一个Handler节点的路由
/** * 直线领导批复一天请假的处理 * @author test11 */ public class Leader extends Handler{ @Override public void resRequest(int days) { if(days<=1){ System.out.println("直线主管审批了你的请求"); }else{ if(null != getNext()){ getNext().resRequest(days); }else{ System.out.println("请求天数不合法"); } } } }
/** * 项目经理批三天假的处理 * @author test11 */ public class PM extends Handler{ @Override public void resRequest(int days) { if(days>1 && days<=3){ System.out.println("项目经理审批了你的请求"); }else{ if(null != getNext()){ getNext().resRequest(days); }else{ System.out.println("请求天数不合法"); } } } }
/** * Boss审批7天休假的处理 * @author test11 */ public class Boss extends Handler{ @Override public void resRequest(int days) { if(days>3){ System.out.println("Boss审批了你的请求"); }else{ if(null != getNext()){ getNext().resRequest(days); }else{ System.out.println("请求天数不合法"); } } } }
客户类(Client)角色:创建客户类,串起处理链并发送请求
/** * 测试责任链模式 * @author test11 */ public class Demo { public static void main(String[] args) { //构建责任链 Handler leader = new Leader(); Handler pm = new PM(); Handler boss = new Boss(); leader.setNext(pm); pm.setNext(boss); //发出处理请求,无需关心最终是谁审批 leader.resRequest(8); } }