1 Chain of Responsibility 定义
Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递 request. 也就是说,来了一个请求,A 类先处理,如果没有处理,就传递到 B 类处理,如果没有处理,就传递到 C 类处理,就这样象一个链条(chain)一样传递下去。
2 如何使用?
1 异常处理try catch就是CoR模式
2 举例:小新请假,找领导批示;请假超过3天主任批示,超过3天小于10天总经理批示;也是CoR模式。
package xx.study.design.cor;
/**
* 请假的基本信息
*
*/
public class LeaveRequest {
private String name;//请假人
private int dayCount;//请假天数
private String remarks;//请假理由
public LeaveRequest(String name, int dayCount, String remarks) {
this.name = name;
this.dayCount = dayCount;
this.remarks = remarks;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDayCount() {
return dayCount;
}
public void setDayCount(int dayCount) {
this.dayCount = dayCount;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}
package xx.study.design.cor;
public abstract class Leader {
protected String name;
protected Leader nextLeader;//下一个继承者
public Leader(String name) {
super();
this.name = name;
}
// 设置责任链上的下一个继承者
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
//处理请求的抽象方法
public abstract void handleRequest(LeaveRequest leavePeople);
}
package xx.study.design.cor;
/**
* 主任类
*
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leavePeople) {
if (leavePeople.getDayCount() <= 3) {
System.out.println("请假人:" + leavePeople.getName() + ",天数:" +
leavePeople.getDayCount() + ",理由:" + leavePeople.getRemarks());
System.out.println("审批人:" + this.name + " 主任,审批通过!");
}else {
if (this.nextLeader != null) {
//让下一个继承者来处理这个问题
this.nextLeader.handleRequest(leavePeople);
}
}
}
}
package xx.study.design.cor;
/**
* 经理
*
*/
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leader) {
if (leader.getDayCount() <= 10) {
System.out.println("请假人:" + leader.getName() + ",天数:" +
leader.getDayCount() + ",理由:" + leader.getRemarks());
System.out.println("审批人:" + this.name + " 经理,审批通过!");
}else {
if (this.nextLeader != null) {
//让下一个继承者来处理这个问题
this.nextLeader.handleRequest(leader);
}
}
}
}
package xx.study.design.cor;
public class CorDemo {
public static void main(String[] args) {
//构建各个领导人
Leader a = new Director("张三");//主任
Leader b = new Manager("李四");//总经理
//设置各个责任链上的关系
a.setNextLeader(b);//主任的下一个审批人为经理
//开始请假
LeaveRequest request = new LeaveRequest("小新", 8, "旅游");
a.handleRequest(request);//小新提交了请假申请给主任
}
}