天天看點

GOF23設計模式之責任鍊模式(chain of responsibility)之實作

/**
 * 請假條
 * 封裝請假的資訊。
 */
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,請假理由:在家帶孩子莫非想辭職,不準許
 * 
 * */
           

繼續閱讀