将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,不能则传递给链上的下一个对象。常见应用场景:异常机制,try,catch。第一个catch不匹配,则跳到下一个catch执行。
现在有一个场景是:员工请假,当请假天数小于三天的时候,主任审批就可以了,大于等于三天,小于十天的时候,总经理审批,大于等于十天,小于三十天的时候,需要CEO审批。这个很明显可以运用责任链模式。
请假人类
public class LeaveRequest {
private String name;
private int leaveDays;
private String reasons;
public LeaveRequest(String name, int leaveDays, String reasons) {
this.name = name;
this.leaveDays = leaveDays;
this.reasons = reasons;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReasons() {
return reasons;
}
public void setReasons(String reasons) {
this.reasons = reasons;
}
}
领导类
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 leaveRequest);
}
主任类
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays() < 3){
System.out.println("主任:"+ this.name + "审批通过");
}else{
if(this.nextLeader!=null){
this.nextLeader.handleRequest(leaveRequest);
}
}
}
}
经理类
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays() < 10){
System.out.println("经理:"+ this.name + "审批通过");
}else{
if(this.nextLeader!=null){
this.nextLeader.handleRequest(leaveRequest);
}
}
}
}
CEO类
public class CEO extends Leader {
public CEO(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays() < 30){
System.out.println("CEO:"+ this.name + "审批通过");
}else{
System.out.println("超过三十天,直接走人");
}
}
}
测试类
public class Test {
public static void main(String[] args) {
Leader director = new Director("zhangsan");
Leader manager = new Manager("lisi");
Leader ceo = new CEO("wangwu");
//设置领导关系
director.setNextLeader(manager);
manager.setNextLeader(ceo);
LeaveRequest leaveRequest = new LeaveRequest("hehe",23,"生病");
director.handleRequest(leaveRequest);
}
}
最后的输出如下:
CEO:wangwu审批通过