责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成
一条链,并沿着这条链传递该请求,直到一个对象处理它为止。 ——摘自《大话设计模式》
Ps:责任处理类都有各自的负责区块,以聚合的方式连成整个的责任链条。
基本结构如下:
①、Request 请求
②、Handler 处理者的超类
Handler 自身的引用,由该属性连接链条
HandleRequest(Request request) 处理请求的方法,该方法用于子类覆写
③、ConcreteHandler 具体的处理者,继承 Handler
HandleRequest(Request request) 覆写超类的处理方法,
内有“区块判断”,本类只处理自己该负责的部分,区块之外的请求会被传递
示例代码:以员工要求请假、加薪,经理们进行审批为例
①、Request #########################################
/** * 请求 */ public class Request { private String type; //请求的类型 private String content; //请求的内容 private int number; //请求的数目 public Request(String type, String content, int number) { this.type = type; this.content = content; this.number = number; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } }
②、Handler #########################################
/** * 管理者 */ public abstract class Manager { protected Manager manager; //设置上级 protected String name; //管理者名称 public Manager(String name){ //要求初始化实例时为名称属性赋值 this.name = name; } public void setManager(Manager manager){//设置管理者 this.manager = manager; } public abstract void requestApplication(Request request); //响应请求 public String getName() { return name; } public void setName(String name) { this.name = name; } public Manager getManager() { return manager; } }
③、ConcreteHandler #########################################
/** * 经理,可处理3天以内的假期请求 */ public class CommonManager extends Manager { public CommonManager(String name) { super(name); } @Override public void requestApplication(Request request) { //覆写请求处理方法 if("请假".equals(request.getType()) && request.getNumber()<=3){ //3天以内的假期请求可自行处理 System.out.println(this.name+":"+request.getContent()+ ",天数:"+request.getNumber()+"\t被批准"); }else if(request!=null){ this.manager.requestApplication(request); //请求在权限之外,传递请求 } } }
/** * 总监,可处理6天以内的假期请求 */ public class MajorManager extends Manager { public MajorManager(String name) { super(name); } @Override public void requestApplication(Request request) { if("请假".equals(request.getType()) && request.getNumber()<=6){ System.out.println(this.name+":"+request.getContent()+ ",天数:"+request.getNumber()+"\t被批准"); }else if(request!=null){ manager.requestApplication(request); } } }
/** * 总经理, 可处理任意天数的假期请求和薪水调整请求 */ public class GeneralManager extends Manager{ public GeneralManager(String name) { super(name); } @Override public void requestApplication(Request request) { if("请假".equals(request.getType())){ System.out.println(this.name+":"+request.getContent()+ ",天数:"+request.getNumber()+"\t被批准"); }else if("加薪".equals(request.getType()) && request.getNumber()<=500){ //500及500以下的加薪请求会被批准 System.out.println(this.name+":"+request.getContent()+ ","+request.getNumber()+"元\t被批准"); }else if("加薪".equals(request.getType()) && request.getNumber()>500){ //500以上的加薪请求会被拒绝 System.out.println(this.name+":"+request.getContent()+ ","+request.getNumber()+"元\t再说吧"); } } }
测试方法:
public class Test { public static void main(String[] args) throws Exception { Manager m1 = new CommonManager("欧阳经理"); Manager m2 = new MajorManager("司马总监"); Manager m3 = new GeneralManager("夏侯总经理"); //设置链条,责任次序 m1.setManager(m2); m2.setManager(m3); //各种请求 Request r1 = new Request("请假","duke要请假",2); Request r2 = new Request("请假","duke要请假",5); Request r3 = new Request("请假","duke要请假",8); Request r4 = new Request("加薪","duke要加薪",500); Request r5 = new Request("加薪","duke要加薪",1000); m1.requestApplication(r1); m1.requestApplication(r2); m1.requestApplication(r3); m1.requestApplication(r4); m1.requestApplication(r5); } }
运行结果:
欧阳经理:duke要请假,天数:2 被批准
司马总监:duke要请假,天数:5 被批准
夏侯总经理:duke要请假,天数:8 被批准
夏侯总经理:duke要加薪,500元 被批准
夏侯总经理:duke要加薪,1000元 再说吧