一、应用场景
当责任或者功能呈层级划分时使用。
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
例如,单位请假审批, 小组长能批一天,超过一天要经理批;经理能批3天,超过3天要找CEO批;超过7天CEO拒绝。
JDK中的Exception类也是使用的责任链模式。
它与
if() {
}else if()
的区别是,当增加新的流程时不需要修改原来的代码,符合开闭原则。
二、 具体实现
实现要点
1. 定义一个abstract class,其中包含责任链的下一个对象和一个处理需求的方法;
2. 定义责任链上的各个类,extends 虚拟类。
3.设置好责任链的上下传递关系。
0. 先定义一个请假条类
public class Request {
private String name; //请假人
private int days; //请假天数
private String excuse; //请假事由
public Request(String name, int days, String excuse) {
this.name = name;
this.days = days;
this.excuse = excuse;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public String getExcuse() {
return excuse;
}
public void setExcuse(String excuse) {
this.excuse = excuse;
}
}
1. 定义一个abstract Leader类,作为每个审批者的原型
public abstract class Leader {
protected Leader nextLeader; //下一个处理的领导
public abstract void handleRequest(Request request); //处理请求
public void setNextLeader(Leader nextLeader){
this.nextLeader = nextLeader;
}
//组织语言,方便打印而已
public String organizeLanguage(Request request){
return new String(request.getName() + "的" + request.getDays() + "天" + request.getExcuse());
}
}
2. 定义各个Leader
class TeamLeader extends Leader{
@Override
public void handleRequest(Request request) {
if (1 >= request.getDays()) {
System.out.println("组长批准" + organizeLanguage(request));
}
else {
this.nextLeader.handleRequest(request);
}
}
}
class Manager extends Leader{
@Override
public void handleRequest(Request request) {
if (3 >= request.getDays()) {
System.out.println("经理批准" + organizeLanguage(request));
}
else {
this.nextLeader.handleRequest(request);
}
}
}
class CEO extends Leader{
@Override
public void handleRequest(Request request) {
if (7 >= request.getDays()) {
System.out.println("CEO批准" + organizeLanguage(request));
}
else {
System.out.println("CEO拒绝批准 " + organizeLanguage(request));
}
}
}
3. 测试类, 在调用之前先设置Leader的层级关系
public class ClientTest {
public static void main(String[] args) {
Request request1 = new Request("Tom", 1, "事假");
Request request2 = new Request("Tom", 2, "事假");
Request request3 = new Request("Tom", 7, "事假");
Request request4 = new Request("Tom", 10, "事假");
TeamLeader teamLeader = new TeamLeader();
Manager manager = new Manager();
CEO ceo = new CEO();
teamLeader.setNextLeader(manager); //设置责任链层级关系
manager.setNextLeader(ceo); //设置责任链层级关系
//测试
teamLeader.handleRequest(request1);
teamLeader.handleRequest(request2);
teamLeader.handleRequest(request3);
teamLeader.handleRequest(request4);
}
}
测试结果