2019年5月13日 星期一

7天學會設計模式 CHAP18 責任鍊模式 Chain Of Responsbility

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap18.
責任鍊模式 Chain Of Responsbility
目的:讓不同的物件有機會能處理同一個請求
package com.ssc24.chap18.demo01;
public abstract class Manager {
 protected String name;
 protected Manager superior;
 public Manager(String name) {
  this.name = name;
 }
 public void setSuperior(Manager superior) {
  this.superior = superior;
 }
 public abstract void apply(ApplyRequest request);
}

package com.ssc24.chap18.demo01;
public class CommonManager extends Manager {
 public CommonManager(String name) {
  super(name);
 }
 @Override
 public void apply(ApplyRequest request) {
  if ("請假".equals(request.getRequestType()) && request.getRequestCount() <= 2) {
   System.out.println(request.getRequestType() + ":" + request.getRequestContent() + " " + 
     request.getRequestCount()  + "天  被" + name + " 批准");
  } else {
   if (superior != null) {
    superior.apply(request);
   }
  }
 }
}

package com.ssc24.chap18.demo01;
public class GeneralManager extends Manager {
 public GeneralManager(String name) {
  super(name);
 }
 @Override
 public void apply(ApplyRequest request) {
  if ("請假".equals(request.getRequestType())) {
   System.out.println(request.getRequestType() + ":" + request.getRequestContent() + " " + 
     request.getRequestCount()  + "天  被" + name + " 批准");
  } else {
   if (request.getRequestCount() <= 1000) {
    System.out.println(request.getRequestType() + ":" + request.getRequestContent() + " " + 
      request.getRequestCount()  + "元  被" + name + " 批准");
   } else {
    System.out.println(request.getRequestType() + ":" + request.getRequestContent() + " " + 
      request.getRequestCount()  + "元  被" + name + " 駁回");
   }
  }
 }
}

package com.ssc24.chap18.demo01;
public class Majordomo extends Manager {
 public Majordomo(String name) {
  super(name);
 }
 @Override
 public void apply(ApplyRequest request) {
  if ("請假".equals(request.getRequestType()) && request.getRequestCount() <= 5) {
   System.out.println(request.getRequestType() + ":" + request.getRequestContent() + " " + 
     request.getRequestCount()  + "天  被" + name + " 批准");
  } else {
   if (superior != null) {
    superior.apply(request);
   }
  }
 }
}

package com.ssc24.chap18.demo01;
public class ApplyRequest {
 private String requestType;
 private String requestContent;
 private int requestCount;
 public String getRequestType() {
  return requestType;
 }
 public void setRequestType(String requestType) {
  this.requestType = requestType;
 }
 public String getRequestContent() {
  return requestContent;
 }
 public void setRequestContent(String requestContent) {
  this.requestContent = requestContent;
 }
 public int getRequestCount() {
  return requestCount;
 }
 public void setRequestCount(int requestCount) {
  this.requestCount = requestCount;
 }
}

package com.ssc24.chap18.demo01;
public class ManagerClient {
 public static void main(String[] args) {
  System.out.println("===責任鍊模式測試===");
  Manager pm = new CommonManager("PM經理");
  Manager gl = new Majordomo("總監");
  Manager gm = new GeneralManager("總經理");
  pm.setSuperior(gl);
  gl.setSuperior(gm);
  ApplyRequest request = new ApplyRequest();
  request.setRequestType("請假");
  request.setRequestContent("小菜請假");
  request.setRequestCount(2);
  pm.apply(request);
  request.setRequestCount(4);
  pm.apply(request);
  request.setRequestType("加薪");
  request.setRequestContent("小菜加薪");
  request.setRequestCount(2000);
  pm.apply(request);
  request.setRequestCount(900);
  pm.apply(request);
 }
}

/**
===責任鍊模式測試===
請假:小菜請假 2天  被PM經理 批准
請假:小菜請假 4天  被總監 批准
加薪:小菜加薪 2000元  被總經理 駁回
加薪:小菜加薪 900元  被總經理 批准
**/