GOF23設計模式之責任鏈模式(chain of responsibility)之實現
來源:程序員人生 發布時間:2015-04-23 08:00:40 閱讀次數:3521次
/**
* 請假條
* 封裝請假的信息。
*/
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,在請假的流程當中,把審批人員
* 主任,經理,總經理,抽象成1個類,他們
* 具有相同的功能,審批。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天,小于10天,經理審批
*/
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 + "審批通過";
}
}
/**
* 總經理: 如果大于等于10天,小于310天,總經理審批
* 時間: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結構,是為了擴大時的方便。
* 例如,此時,我們如果想要加入1位副總經理,來處理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,請假理由:在家帶孩子難道想辭職,不批準
*
*
*/
/**
* 加入副總經理處理10天到210天的假條審核
* 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,請假理由:在家帶孩子難道想辭職,不批準
*
* */
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈