《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介
生活随笔
收集整理的這篇文章主要介紹了
《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
場景:申請經費,有好幾個領導審批,項目經理、部門經理、總經理,最后總會有一個人回復審批結果。
1. 正常編碼
public class FeeRequest {//提交聚餐費用申請給項目經理 public String requestToProjectManager(String user,double fee){String str = "";if(fee < 500){//項目經理的權限比較小,只能在500以內str = this.projectHandle(user, fee);}else if(fee < 1000){//部門經理的權限只能在1000以內str = this.depManagerHandle(user, fee);}else if(fee >= 1000){//總經理的權限很大,只要請求到了這里,他都可以處理str = this.generalManagerHandle(user, fee);}return str;}//項目經理審批費用申請,參數、返回值和上面是一樣的,省略了 private String projectHandle(String user, double fee) {String str = "";//為了測試,簡單點,只同意小李的if("小李".equals(user)){str = "項目經理同意"+user+"聚餐費用"+fee+"元的請求";}else{//其他人一律不同意str = "項目經理不同意"+user+"聚餐費用"+fee+"元的請求";}return str;}//部門經理審批費用申請,參數、返回值和上面是一樣的,省略了 private String depManagerHandle(String user, double fee) {String str = "";//為了測試,簡單點,只同意小李申請的if("小李".equals(user)){str = "部門經理同意"+user+"聚餐費用"+fee+"元的請求";}else{//其他人一律不同意str= "部門經理不同意"+user+"聚餐費用"+fee+"元的請求";}return str;}//總經理審批費用申請,參數、返回值和上面是一樣的,省略了 private String generalManagerHandle(String user, double fee) {String str = "";//為了測試,簡單點,只同意小李的if("小李".equals(user)){str = "總經理同意"+user+"聚餐費用"+fee+"元的請求";}else{//其他人一律不同意str = "總經理不同意"+user+"聚餐費用"+fee+"元的請求";}return str;} }public class Client {public static void main(String[] args) {FeeRequest request = new FeeRequest();//開始測試String ret1 = request.requestToProjectManager("小李", 300);System.out.println("the ret1="+ret1); String ret2 = request.requestToProjectManager("小張", 300);System.out.println("the ret2="+ret2);String ret3 = request.requestToProjectManager("小李", 600);System.out.println("the ret3="+ret3); String ret4 = request.requestToProjectManager("小張", 600);System.out.println("the ret4="+ret4);String ret5 = request.requestToProjectManager("小李", 1200);System.out.println("the ret5="+ret5); String ret6 = request.requestToProjectManager("小張", 1200);System.out.println("the ret6="+ret6);} }抽象問題:客戶端發出一個請求,會有很多對象都可以來處理這個請求,而且不同對象的處理邏輯是不一樣的。還希望處理流程是可以靈活變動的,而處理請求的對象需要能方便地修改或者是被替換掉,以適應新的業務功能的需要。
2. 模式介紹
public abstract class Handler { protected Handler successor; //持有后繼的職責對象 //設置后繼的職責對象 public void setSuccessor(Handler successor) {this.successor = successor;}//持有后繼的職責對象 示意處理請求的方法,雖然這個示意方法是沒有傳入參數,但實際是可以傳入參數的,根據具體需要來選擇是否傳遞參數 public abstract void handleRequest(); }public class ConcreteHandler1 extends Handler {public void handleRequest() {//根據某些條件來判斷是否屬于自己處理的職責范圍//判斷條件比如:從外部傳入的參數,或者這里主動去獲取的外部數據,//如從數據庫中獲取等,下面這句話只是個示意boolean someCondition = false;if(someCondition){//如果屬于自己處理的職責范圍,就在這里處理請求//具體的處理代碼System.out.println("ConcreteHandler1 handle request");}else{//如果不屬于自己處理的職責范圍,那就判斷是否還有后繼的職責對象//如果有,就轉發請求給后繼的職責對象//如果沒有,什么都不做,自然結束if(this.successor!=null){this.successor.handleRequest();}}} }public class ConcreteHandler2 extends Handler { ... }public class Client {public static void main(String[] args) {//先要組裝職責鏈Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();h1.setSuccessor(h2); //然后提交請求h1.handleRequest();} }總結
以上是生活随笔為你收集整理的《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《研磨设计模式》chap18 状态模式s
- 下一篇: 《研磨设计模式》chap23 职责链模式