《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
生活随笔
收集整理的這篇文章主要介紹了
《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 初步實現(xiàn)
2. 功能擴展
兩種請求,還有處理另外一種費用。
//定義職責對象的接口 public abstract class Handler {// 持有下一個處理請求的對象 protected Handler successor = null;//設(shè)置下一個處理請求的對象 public void setSuccessor(Handler successor){this.successor = successor;}//處理聚餐費用的申請 public abstract String handleFeeRequest(String user,double fee);//處理預(yù)支差旅費用的申請 public abstract boolean handlePreFeeRequest(String user,double requestFee); }public class DepManager extends Handler{ public String handleFeeRequest(String user, double fee) {String str = "";//部門經(jīng)理的權(quán)限只能在1000以內(nèi)if(fee < 1000){//為了測試,簡單點,只同意小李申請的if("小李".equals(user)){str = "部門經(jīng)理同意"+user+"聚餐費用"+fee+"元的請求";}else{//其他人一律不同意str = "部門經(jīng)理不同意"+user+"聚餐費用"+fee+"元的請求";}return str;}else{//超過1000,繼續(xù)傳遞給級別更高的人處理if(this.successor!=null){return this.successor.handleFeeRequest(user, fee);}}return str;}public boolean handlePreFeeRequest(String user, double requestNum) {//部門經(jīng)理的權(quán)限比較小,只能在20000以內(nèi)if(requestNum < 20000){//工作需要嘛,統(tǒng)統(tǒng)同意System.out.println("部門經(jīng)理同意"+user+"預(yù)支差旅費用"+requestNum+"元的請求");return true;}else{//超過20000,繼續(xù)傳遞給級別更高的人處理if(this.successor!=null){return this.successor.handlePreFeeRequest(user, requestNum);}}return false;} }public class Client {public static void main(String[] args) {//先要組裝職責鏈 Handler h1 = new GeneralManager();Handler h2 = new DepManager();Handler h3 = new ProjectManager();h3.setSuccessor(h2);h2.setSuccessor(h1);//開始測試申請聚餐費用String ret1 = h3.handleFeeRequest("小李", 300);System.out.println("the ret1="+ret1);String ret2 = h3.handleFeeRequest("小李", 600);System.out.println("the ret2="+ret2);String ret3 = h3.handleFeeRequest("小李", 1200);System.out.println("the ret3="+ret3);//開始測試申請差旅費用h3.handlePreFeeRequest("小張", 3000);h3.handlePreFeeRequest("小張", 6000);h3.handlePreFeeRequest("小張", 32000);} }帶來問題:老是要改接口。
3. 更好的方法
//定義職責對象的接口 public abstract class Handler { protected Handler successor = null; //持有下一個處理請求的對象//設(shè)置下一個處理請求的對象public void setSuccessor(Handler successor){this.successor = successor;}//通用的請求處理方法 public Object handleRequest(RequestModel rm){if(successor != null){//這個是默認的實現(xiàn),如果子類不愿意處理這個請求,那就傳遞到下一個職責對象去處理return this.successor.handleRequest(rm);}else{System.out.println("沒有后續(xù)處理或者暫時不支持這樣的功能處理");return false;}} }public class RequestModel {//表示具體的業(yè)務(wù)類型 private String type;//通過構(gòu)造方法把具體的業(yè)務(wù)類型傳遞進來 public RequestModel(String type){this.type = type;}public String getType() {return type;} }public class PreFeeRequestModel extends RequestModel{//約定具體的業(yè)務(wù)類型 public final static String FEE_TYPE = "preFee";public PreFeeRequestModel() {super(FEE_TYPE);}private String user; //申請人 private double fee; //申請金額public String getUser() {return user;}public void setUser(String user) {this.user = user;}public double getFee() {return fee;}public void setFee(double fee) {this.fee = fee;} }//處理聚餐費用 public class DepManager extends Handler{public Object handleRequest(RequestModel rm){ if(FeeRequestModel.FEE_TYPE.equals(rm.getType())){return handleFeeRequest(rm);}else{return super.handleRequest(rm);}}private Object handleFeeRequest(RequestModel rm) {//先把通用的對象造型回來FeeRequestModel frm = (FeeRequestModel)rm;String str = "";//部門經(jīng)理的權(quán)限只能在1000以內(nèi)if(frm.getFee() < 1000){//為了測試,簡單點,只同意小李申請的if("小李".equals(frm.getUser())){str = "部門經(jīng)理同意"+frm.getUser()+"聚餐費用"+frm.getFee()+"元的請求";}else{//其他人一律不同意str = "部門經(jīng)理不同意"+frm.getUser()+"聚餐費用"+frm.getFee()+"元的請求";}return str;}else{//超過1000,繼續(xù)傳遞給級別更高的人處理if(this.successor!=null){return this.successor.handleRequest(rm);}}return str;} }//處理預(yù)支差旅費用 public class DepManager2 extends DepManager{public Object handleRequest(RequestModel request){if(PreFeeRequestModel.FEE_TYPE.equals(request.getType())){//表示預(yù)支差旅費用申請return myHandler(request);}else{//其他的讓父類去處理return super.handleRequest(request);}}private Object myHandler(RequestModel request) {//先把通用的對象造型回來PreFeeRequestModel fr = (PreFeeRequestModel)request;//部門經(jīng)理的權(quán)限比較小,只能在20000以內(nèi)if(fr.getFee() < 20000){//工作需要嘛,統(tǒng)統(tǒng)同意System.out.println("部門經(jīng)理同意"+fr.getUser()+"預(yù)支差旅費用"+fr.getFee()+"元的請求");return true;}else{//超過20000,繼續(xù)傳遞給級別更高的人處理if(this.successor != null){return this.successor.handleRequest(request);}}return false;} }public class GeneralManager extends Handler{ ... }public class GeneralManager2 extends GeneralManager{ ... }public class Client {public static void main(String[] args) {//先要組裝職責鏈 Handler h1 = new GeneralManager2();Handler h2 = new DepManager2();Handler h3 = new ProjectManager2();h3.setSuccessor(h2);h2.setSuccessor(h1);//開始測試申請聚餐費用FeeRequestModel frm = new FeeRequestModel();frm.setFee(300);frm.setUser("小李");//調(diào)用處理String ret1 = (String)h3.handleRequest(frm);System.out.println("ret1="+ret1);//重新設(shè)置申請金額,再調(diào)用處理frm.setFee(800); h3.handleRequest(frm);String ret2 = (String)h3.handleRequest(frm);System.out.println("ret2="+ret2);//重新設(shè)置申請金額,再調(diào)用處理frm.setFee(1600); h3.handleRequest(frm);String ret3 = (String)h3.handleRequest(frm);System.out.println("ret3="+ret3);//開始測試申請預(yù)支差旅費用PreFeeRequestModel pfrm = new PreFeeRequestModel();pfrm.setFee(3000);pfrm.setUser("小張");//調(diào)用處理h3.handleRequest(pfrm);//重新設(shè)置申請金額,再調(diào)用處理pfrm.setFee(6000);h3.handleRequest(pfrm);//重新設(shè)置申請金額,再調(diào)用處理pfrm.setFee(36000);h3.handleRequest(pfrm);} }總結(jié)
以上是生活随笔為你收集整理的《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《研磨设计模式》chap23 职责链模式
- 下一篇: 《研磨设计模式》chap23 职责链模式