模式动机:
在很多情况下,可以处理某个请求的对象不止一个,如大学里的奖学金审批,学生在向辅导员提交审批表之后,首先是辅导员签字审批,然后交给系主任签字审批,接着是院长审批,最后可能是校长审批,在这个过程中,奖学金申请表可以看成是一个请求对象,而不同级别的审批者都可以处理该请求对象,除了辅导员之外,学生不需要一一和其他审批者交互,只需等待结果即可。在审批过程中如果某一个审批者任务不符合条件,则请求中止;否则将请求递交给下一个审批者,最后由校长来确定谁能够授予奖学金。该过程如下:
在图中,从辅导员直到校长都可以处理申请表,而且他们构成了一条链,申请表沿着这条链传递,这条链就叫职责链。
职责链可以是一条直线,一个环或则一个树形结构,最常见的是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。(客户类只需关心链的源头,而无需关心请求的处理细节及请求的传递过程)
模式定义:
职责链模式Chain of responsibility pattern:
package 审批假条; public class LeaveRequest { private String leaveName; private int leaveDays; public LeaveRequest(String leaveName,int leaveDays) { this.leaveName=leaveName; this.leaveDays=leaveDays; } public String getLeaveName() { return leaveName; } public void setLeaveName(String leaveName) { this.leaveName = leaveName; } public int getLeaveDays() { return leaveDays; } public void setLeaveDays(int leaveDays) { this.leaveDays = leaveDays; } }
抽象处理者Leader类:
public abstract class Leader { protected String name; protected Leader successor; public Leader(String name) { this.name=name; } public void setSuccessor(Leader successor) { this.successor=successor; } public abstract void handleRequest(LeaveRequest request); }
具体处理者Director主任类:
public class Director extends Leader{ public Director(String name) { super(name); } public void handleRequest(LeaveRequest request) { if(request.getLeaveDays()<3) { System.out.println("主任"+name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天"); } else { if(this.successor!=null) { this.successor.handleRequest(request); } } } }
Manager类:
public class Manager extends Leader { public Manager(String name) { super(name); } public void handleRequest(LeaveRequest request) { if(request.getLeaveDays()<10) { System.out.println("经理"+name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天"); } else { if(this.successor!=null) { this.successor.handleRequest(request); } } } }
GeneralManager总经理类:]
public class GeneralManager extends Leader { public GeneralManager(String name) { super(name); } public void handleRequest(LeaveRequest request) { if(request.getLeaveDays()<30) { System.out.println("宗经理"+name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天"); } else { System.out.println("莫非"+request.getLeaveName()+"想辞职,居然请假"+request.getLeaveDays()+"天"); } } }
Client类:
public class Client { public static void main(String[] args) { Leader objDirector,objManager,objGeneralManager; objDirector=new Director("王明"); objManager=new Manager("赵强"); objGeneralManager=new GeneralManager("李波"); objDirector.setSuccessor(objManager); objManager.setSuccessor(objGeneralManager); LeaveRequest lr1=new LeaveRequest("张三",2); objDirector.handleRequest(lr1); LeaveRequest lr2=new LeaveRequest("张四",5); objDirector.handleRequest(lr2); LeaveRequest lr3=new LeaveRequest("张五",15); objDirector.handleRequest(lr3); LeaveRequest lr4=new LeaveRequest("张六",45); objDirector.handleRequest(lr4); } }
运行结果:
主任王明审批员工张三的请假条,请假天数为2天
经理赵强审批员工张四的请假条,请假天数为5天
宗经理李波审批员工张五的请假条,请假天数为15天
莫非张六想辞职,居然请假45天
要想增加新的处理者,建立一个处理者类然后在客户端修改successor即可。
职责链模式优点: