责任链设计模式(公司请假示例)
0. UML结构图
1. 休假请求Code
public class LeaveRequest {
private String name;
private int days;
private String reason;
public LeaveRequest(String name, int days, String reason) {
this.name = name;
this.days = days;
this.reason = reason;
}
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 getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
@Override
public String toString() {
return "LeaveRequest{" +
"name='" + name + '\'' +
", days=" + days +
", reason='" + reason + '\'' +
'}';
}
}
2. 责任对象Code
2.1 领导的抽象类
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);
}
2.2 责任链第一个对象 - 主任
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getDays() <= 3) {
System.out.println(this.name + "主任批准了" + leaveRequest.getName() + "的休假!");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(leaveRequest);
}
}
}
}
2.3 责任链第二个对象 - 经理
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getDays() <= 10) {
System.out.println(this.name + "经理批准了" + leaveRequest.getName() + "的休假!");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(leaveRequest);
}
}
}
}
2.4 责任链第三个对象 - 总经理
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getDays() <= 30) {
System.out.println(this.name + "总经理批准了" + leaveRequest.getName() + "的休假!");
} else {
System.out.println("请假时间过长,不予通过!");
}
}
}
3. 公司请假示例Test
public class ChainTest {
public static void main(String[] args) {
Leader bill = new Director("Bill");
Leader lily = new Manager("Lily");
Leader white = new GeneralManager("White");
bill.setNextLeader(lily);
lily.setNextLeader(white);
LeaveRequest leaveRequest = new LeaveRequest("小王", 5, "亲戚结婚,需要参加!");
System.out.println(leaveRequest);
bill.handleRequest(leaveRequest);
}
}