责任链模式
所谓的责任链模式的话,我们可以简单的理解为是什么呢?我举一个简单例子。比如说在一个公司中,有一个员工请假了。那么我们规定,如果请假的天数小于3天的话,那么主任可以处理。如果小于10天的话,那么经理可以处理。如果小于30天的话,那么总经理可以处理。主任,经理和总经理之间就形成了一条责任链。请假这一个请求就沿着这条责任链传递,直到这个请求被处理了为止。这就是所谓的责任链模式。
有的人可能会说,如果是这样的话,那么我使用if,else if,else不也是可以进行处理吗?但是,如果请假的处理是很复杂的话,那么你使用这样的方式进行处理,那么就显得不是很正确了。还有就是如果我增加了一个副总经理对请假这个需求进行处理的话,那么不是需要对原有的代码进行大量的修改吗?所以这样的方式,我们是不提倡的。所以对于这一类的需求的话,我们首先推荐的是责任链模式。这是要注意的。
接下来我们就以请假的例子来写代码:
首先,我们来看一下类图的关系:
在这里的话,我们首先需要有一个请假的请求。
接下来需要定义的是抽象处理者。(leader)
接下来需要定义处理请假请求的三个leader.Director(主任),Manager(经理),GeneralManager(总经理).
package com.bjsxt.chainOfResp;
/**
* 封装请假的基本信息.封装的是请假的请求。
* @author Administrator
*
*/
public class LeaveRequest {
private String empName;
private int leaveDays;
private String reason;
public LeaveRequest(String empName, int leaveDays, String reason) {
super();
this.empName = empName;//请假的员工的名字
this.leaveDays = leaveDays;//请假的天数
this.reason = reason;//请假的原因
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
package com.bjsxt.chainOfResp;
/**
* 抽象类 Leader的抽象类
* @author Administrator
*
*/
public abstract class Leader {
protected String name;//leader的名字
protected Leader nextLeader; //责任链上的后继对象
public Leader(String name) {
super();
this.name = name;
}
//设定责任链上的后继对象
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
/**
* 处理请求的核心的业务方法。由于每一个leader的权利是不一样的,所以
*这个处理请求的方法需要有具体的leader来进行实现
* @param request
*/
public abstract void handleRequest(LeaveRequest request);
}
package com.bjsxt.chainOfResp;
/**
* 主任
* @author Administrator
*
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getLeaveDays()<3){
System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("主任:"+this.name+",审批通过!");
}else{
if(this.nextLeader!=null){//需要判断一下,他的下一个leader是否为空。因为
//总经理的话是没有nextleader的。
this.nextLeader.handleRequest(request);
}
}
}
}
package com.bjsxt.chainOfResp;
/**
* 总经理
* @author Administrator
*
*/
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getLeaveDays()<30){
System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("总经理:"+this.name+",审批通过!");
}else{
System.out.println("莫非"+request.getEmpName()+"想辞职,居然请假"+request.getLeaveDays()+"天!");
}
}
}
//接下来我们写一个简单的类来进行测试
package com.bjsxt.chainOfResp;
public class Client {
public static void main(String[] args) {
Leader a = new Director("张三");
Leader b = new Manager("李四");
Leader b2 = new ViceGeneralManager("李小四");
Leader c = new GeneralManager("王五");
//组织责任链对象的关系
a.setNextLeader(b);
b.setNextLeader(b2);
b2.setNextLeader(c);
//开始请假操作
LeaveRequest req1 = new LeaveRequest("TOM", 15, "回英国老家探亲!");
a.handleRequest(req1);
}
}
那么如果我想再增加副总经理这个职位对请假这个请求进行处理的话,其实也是挺简单的了:
package com.bjsxt.chainOfResp;
/**
* 副总经理
* @author Administrator
*
*/
public class ViceGeneralManager extends Leader {
public ViceGeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getLeaveDays()<20){
System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("副总经理:"+this.name+",审批通过!");
}else{
if(this.nextLeader!=null){
this.nextLeader.handleRequest(request);
}
}
}
}