/**
* 請假條
* 封裝請假的資訊。
*/
package com.bjsxt.cn.chainOfResponsibility;
public class LeaveRequest {
private String empName;
private int leaveDays;
private String reasons;
public LeaveRequest(String empName, int leaveDays, String reasons) {
super();
this.empName = empName;
this.leaveDays = leaveDays;
this.reasons = reasons;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
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;
}
@Override
public String toString() {
return "雇員:" + empName + "請假,天數:" + leaveDays + ",請假理由:" + reasons;
}
}
/**
* 抽象類Leader,在請假的流程之中,把審批人員
* 主任,經理,總經理,抽象成一個類,他們
* 具有相同的功能,審批。handleRequest
* 2015年4月9日14:40:49
*
*/
package com.bjsxt.cn.chainOfResponsibility;
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 request);
public abstract String check();
}
/**
* 主任類:
* 如果請假天數小于3天,主任審批
* 2015年4月9日14:43:36
*/
package com.bjsxt.cn.chainOfResponsibility;
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.getReasons());
System.out.println(check());
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
@Override
public String check() {
return "主任:" + name + "審批通過!";
}
}
/**
* 時間:2015年4月9日14:48:13
* 經理類: 如果請假條數大于等于3天,小于十天,經理審批
*/
package com.bjsxt.cn.chainOfResponsibility;
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.toString());
System.out.println(check());
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
@Override
public String check() {
return "經理:" + name + "審批通過";
}
}
/**
* 總經理: 如果大于等于十天,小于三十天,總經理審批
* 時間:2015年4月9日14:53:41
*/
package com.bjsxt.cn.chainOfResponsibility;
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.toString());
System.out.println(check());
} else {
System.out.println(request.toString() + "莫非想辭職,不準許");
}
}
@Override
public String check() {
return "總經理 :" + name +"稽核通過";
}
}
/**
* 2015年4月9日14:59:50
* 測試程式:測試責任鍊模式的使用
* 我們使用責任鍊模式而不是非常繁冗複雜的ifelse結構,是為了擴充時的友善。
* 例如,此時,我們如果想要加入一位副總經理,來處理10到20天的假條稽核
* 我們隻需要加入新的類ViceGeneralManager,在客戶程式中建立新的責任鍊即可。
* 這樣符合OCP原則,即開閉原則。
*/
package com.bjsxt.cn.chainOfResponsibility;
public class Client {
public static void main(String[] args) {
LeaveRequest l1 = new LeaveRequest("傑倫", 1, "旅遊");
LeaveRequest l2 = new LeaveRequest("張靓穎", 8, "戀愛");
LeaveRequest l3 = new LeaveRequest("夏洛蒂", 15, "失戀了");
LeaveRequest l4 = new LeaveRequest("巴赫", 37, "在家帶孩子");
Leader ll1 = new Director("張主任");
Leader ll2 = new Manager("李經理");
Leader ll3 = new GeneralManager("王總經理");
//建立責任鍊
ll1.setNextLeader(ll2);
ll2.setNextLeader(ll3);
ll1.handleRequest(l1);
ll1.handleRequest(l2);
ll1.handleRequest(l3);
ll1.handleRequest(l4);
}
}
/*
雇員名字:傑倫請假,天數為:1請假原因為旅遊
主任:張主任審批通過!
雇員:張靓穎請假,天數:8,請假理由:戀愛
經理:李經理審批通過
雇員:夏洛蒂請假,天數:15,請假理由:失戀了
總經理 :王總經理稽核通過
雇員:巴赫請假,天數:37,請假理由:在家帶孩子莫非想辭職,不準許
*
*
*/
/**
* 加入副總經理處理十天到二十天的假條稽核
* 2015年4月9日15:12:46
*/
package com.bjsxt.cn.chainOfResponsibility;
public class ViceGeneralManager extends Leader{
public ViceGeneralManager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() < 20) {
System.out.println(request.toString());
System.out.println(check());
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
@Override
public String check() {
return "副總經理:" + name + "稽核通過";
}
}
/**
* 增加ViceGeneralManager類之後稍作調整就可以加入加入該類之後的新的責任鍊。
*/
package com.bjsxt.cn.chainOfResponsibility;
public class Client2 {
public static void main(String[] args) {
LeaveRequest l1 = new LeaveRequest("傑倫", 1, "旅遊");
LeaveRequest l2 = new LeaveRequest("張靓穎", 8, "戀愛");
LeaveRequest l3 = new LeaveRequest("夏洛蒂", 15, "失戀了");
LeaveRequest l4 = new LeaveRequest("巴赫", 37, "在家帶孩子");
Leader ll1 = new Director("張主任");
Leader ll2 = new Manager("李經理");
Leader ll22 = new ViceGeneralManager("王副總經理");
Leader ll3 = new GeneralManager("王總經理");
//建立責任鍊
ll1.setNextLeader(ll2);
ll2.setNextLeader(ll22);
ll22.setNextLeader(ll3);
ll1.handleRequest(l1);
ll1.handleRequest(l2);
ll1.handleRequest(l3);
ll1.handleRequest(l4);
}
}
/*
*
雇員名字:傑倫請假,天數為:1請假原因為旅遊
主任:張主任審批通過!
雇員:張靓穎請假,天數:8,請假理由:戀愛
經理:李經理審批通過
雇員:夏洛蒂請假,天數:15,請假理由:失戀了
副總經理:王副總經理稽核通過
雇員:巴赫請假,天數:37,請假理由:在家帶孩子莫非想辭職,不準許
*
* */