設(shè)計(jì)模式之Chain of Responsibility(職責(zé)鏈)
Chain of Responsibility(CoR) 是用一系列類(classes)試圖處理一個(gè)請(qǐng)求request,這些類之間是一個(gè)松散的耦合,唯一共同點(diǎn)是在他們之間傳遞request. 也就是說(shuō),來(lái)了一個(gè)請(qǐng)求,,A類先處理,,如果沒(méi)有處理,就傳遞到B類處理,,如果沒(méi)有處理,,就傳遞到C類處理,就這樣象一個(gè)鏈條(chain)一樣傳遞下去,。 如何使用? 有一個(gè)Handler接口: public interface Handler{ 這是一個(gè)處理request的事例,, 如果有多種request,比如 請(qǐng)求幫助 請(qǐng)求打印 或請(qǐng)求格式化: } 具體是一段實(shí)現(xiàn)接口Handler代碼: public ConcreteHandler(Handler successor){ public void handleHelp(){ public void handlePrint(){ } 雖然思路簡(jiǎn)單明了,,但是有一個(gè)擴(kuò)展問(wèn)題,,如果我們需要再增加一個(gè)請(qǐng)求request種類,需要修改接口及其每一個(gè)實(shí)現(xiàn),。 第二方案:將每種request都變成一個(gè)接口,因此我們有以下代碼 : public interface HelpHandler{ public interface PrintHandler{ public interface FormatHandler{ public class ConcreteHandler public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler formatSuccessor) public void handleHelp(){ public void handlePrint(){this.printSuccessor=printSuccessor;} public void handleFormat(){this.formatSuccessor=formatSuccessor;} } 這個(gè)辦法在增加新的請(qǐng)求request情況下,,只是節(jié)省了接口的修改量,,接口實(shí)現(xiàn)ConcreteHandler還需要修改。而且代碼顯然不簡(jiǎn)單美麗,。 解決方案3: 在Handler接口中只使用一個(gè)參數(shù)化方法: public ConcreteHandler(Handler successor){ public void handleRequest(String request){ } } 這里先假設(shè)request是String類型,,如果不是怎么辦?當(dāng)然我們可以創(chuàng)建一個(gè)專門類Request 最后解決方案:接口Handler的代碼如下: public String getType(){return type;} public void execute(){ public ConcreteHandler(Handler successor){ public void handleRequest(Request request){ } } 這個(gè)解決方案就是CoR, 在一個(gè)鏈上,都有相應(yīng)職責(zé)的類,因此叫Chain of Responsibility. CoR的優(yōu)點(diǎn): 缺點(diǎn)是效率低,因?yàn)橐粋€(gè)請(qǐng)求的完成可能要遍歷到最后才可能完成,,當(dāng)然也可以用樹的概念優(yōu)化,。 在Java AWT1.0中,對(duì)于鼠標(biāo)按鍵事情的處理就是使用CoR,到Java.1.1以后,,就使用Observer代替CoR 擴(kuò)展性差,,因?yàn)樵?span lang=EN-US>CoR中,,一定要有一個(gè)統(tǒng)一的接口Handler.局限性就在這里。 與Command模式區(qū)別: Command 模式需要事先協(xié)商客戶端和服務(wù)器端的調(diào)用關(guān)系,,比如 1 代表 start 2 代表 move 等,,這些 都是封裝在 request 中,到達(dá)服務(wù)器端再分解,。 CoR 模式就無(wú)需這種事先約定,,服務(wù)器端可以使用 CoR 模式進(jìn)行客戶端請(qǐng)求的猜測(cè),一個(gè)個(gè)猜測(cè) 試驗(yàn),。 |
|
來(lái)自: HaiLan > 《設(shè)計(jì)模式》