责任链模式(Chain)
定义:责任链模式就是将请求的接收者对象连成一条链,然后在这一条链上传递请求,直到有个一接收者处理这个请求。通过这样一种方式,避免了请求者和接收者之间的耦合.
场景:打牌时,轮流出牌,接力赛跑,公司的公文审批
模拟公司里面,请假条的审批过程:
• 如果请假天数小于3天,主任审批
• 如果请假天数大于等于3天,小于10天,经理审批
• 如果大于等于10天,小于30天,总经理审批
• 如果大于等于30天,提示拒绝
package com.xiaoqiang.gof23.actionnModel.chainOfResq;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*抽象类
*
* 处理的流程
*
*/
public abstract class Leader {
protected String name;
// 责任链的后继对象
protected Leader nextLeader;
public Leader(String name) {
this.name = name;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
// 处理请求的核心方法
public abstract void handleRequest(LeaveRequest request);
}
主任
package com.xiaoqiang.gof23.actionnModel.chainOfResq;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
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()+"主任"+this.name+"审批通过");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
}
经理
package com.xiaoqiang.gof23.actionnModel.chainOfResq;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
* 经理
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() < 10) {
System.out.println("员工"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+"天,理由:"
+request.getReason()+"经理"+this.name+"审批通过");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
}
总经理
package com.xiaoqiang.gof23.actionnModel.chainOfResq;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
* 经理
*/
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()+"总经理"+this.name+"审批通过");
} else {
if (this.nextLeader != null) {
System.out.println("莫非" + request.getEmpName() + "想辞职,居然请假" + request.getLeaveDays() + "天!");
}
}
}
}
客户端
package com.xiaoqiang.gof23.actionnModel.chainOfResq;
/**
* @author xiaoqiang
* @date $(DATE)-$(TIME)
*/
public class Client {
public static void main(String[] args) {
Leader a = new Director("张三");
Leader b = new Manager("李四");
Leader c = new GeneralManager("王五");
// 责任链对象的关系
a.setNextLeader(b);
b.setNextLeader(c);
LeaveRequest request = new LeaveRequest("Tom", 1, "请病假");
a.handleRequest(request);
}
}
总结,平常的处理是用if /else if 语句来判断条件,但是当要新增加条件是需要修改原来的代码,而责任链模式就可以通过增加新的类来实现条件的控制
z