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