get to the points first. the article comes from lawsonabs!
學生守則裡這麼說:需要請假一天的,可以向輔導員申請;需要請假三天的,可以向院主任申請;如果需要請假一周的,則需要處長簽字了。如果需要請假乙個月的,則需要向校長申請;如果請假時間大於乙個月,則可以直接退學了。這裡就涉及到了職責鏈模式。職責鏈模式的關鍵是:將不能處理的事務向後延遲處理/交給他人處理,而不管這件事是否能夠處理。
避免將請求傳送者與接受者耦合在一起,讓多個物件都有機會處理接收請求,將這些物件鏈結成一條鏈,並且沿著這條連傳遞請求,直到有物件處理為止。
安徽師範大學(anhui normal university)的裝置採購採用分級審批制度,系主任(dean)可以審批1w以內(含1w)的採購,院長(chiarman)可以審批5w以內(含5w)的採購,副校長(vicepresident)可以審批10w以內(含10w)的採購;校長(headmaster)可以審批100w以內(含100w)的採購,100w以上的採購校內沒有審批許可權。請採用職責鏈模式實現該例。
對案例分析可知,有dean,chairman,vicepresident,headmaster,四類事物處理物件。他們都有事物處理的能力。故將其抽象出來得乙個抽象類:handler:表示事物的抽象處理者,而這個類有乙個方法,是用來處理事務的,暫且叫做dealwith()方法吧。同樣,我們可以將事務表示為乙個類:thing:表示事務類,其中的成員變數有「事務名稱」,「事務性質」等。
具體的事務處理者類總結得到如下:
handler:抽象處理者類
thing:事務類
dean:系主任
vicepresident:副校長類,
chairman:院長類,
headmaster:校長類
client:客戶端類
package liu.shen.util;
/** * 客戶端類
* @author object
* */
public class client
}
package liu.shen.util;
/** * 事務類
* @author object
* */
public class thing
public void setthingname(string thingname)
public int getthingmoney()
public void setthingmoney(int thingmoney)
}
package liu.shen.util;
/** * 抽象處理者類
* @author object
* */
public abstract class handler
abstract void dealwith(thing thing);//表示抽象的處理方法
}
package liu.shen.util;
/** * 系主任類
* @author object
* */
public class dean extends handler
@override
public void dealwith(thing thing)
//如果不能處理--->轉交至下一級
else
}}
package liu.shen.util;
/** * 院長類
* @author object
* */
public class chairman extends handler
@override
void dealwith(thing thing)
//如果不能處理--->轉交至下一級
else
}}
package liu.shen.util;
/** * 副校長類
* @author object
* */
public class vicepresident extends handler
@override
void dealwith(thing thing)
//如果不能處理--->轉交至下一級
else
}}
package liu.shen.util;
/** * 校長類
* @author object
* */
public class headmaster extends handler
@override
void dealwith(thing thing)
//如果不能處理--->轉交至下一級
else
}}
(1)職責鏈模式時一類很常見的模式。就像開頭說的那樣,職責鏈模式避免將請求傳送者與接受者耦合在一起,從而讓多個物件都有機會處理接收請求,將這些物件連線成一條鏈並且沿著這條鏈傳遞請求。
(2)這一類模式中最重要的乙個技術就是實現職責鏈的傳遞。這裡的職責鏈就是指的是:構造器的……new handler(handler handler),在client中的實現是
headmaster headmaster = new headmaster(handler);//校長
vicepresident vicepresident = new vicepresident(headmaster);//副校長
chairman chairman = new chairman(vicepresident);//院長
dean dean = new dean(chairman);//系主任---->以及下一級
只有這一部分處理好之後,才會將整個職責鏈傳遞下去。比如dean這個類以及dean這個物件來說,dean這個整體物件包含乙個叫做chairman的部分物件。這裡使用到了聚合關係,使用構造注入的方法將chairman類的物件作為dean類的成員變數。關於這一部分,有詳細的聚合,組合等關聯關係介紹。正是因為有了chairman這個物件之後,dean處理不了的事情,才會使用this.handler.dealwith()方法繼續處理下去。 職責鏈模式
1.職責鏈 namespace dutychainpattern 用來處理請求 public abstract void transmitrequest int request 班主任 職責鏈上的乙個節點,在裡面進行判斷,看能否處理請求,不能則將請求轉移 public class classadvi...
職責鏈模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...
職責鏈模式
劇情簡要 學習此模式,讓筆者聯想到自然界的生物鏈。打個比方 大魚吃小魚,小魚吃蝦公尺。河裡的小蝦公尺問大魚,你要不要吃我啊?大魚說 你太小了,吃了 沒吃,return 懶得吃!然後蝦公尺又問小魚 小螃蟹 小河馬同樣的問題。其實如果小蝦公尺這麼想自我了結的話,根本不用這麼費勁。這就開始了我們職責鏈模式...