責任鏈模式就是使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。責任鏈模式重點是在鏈上,鏈上的節點都有可能處理請求,前提是必須是符合處理該節點處理條件,如果不符合將繼續查詢下乙個節點,而處理功能通常會採用遞迴的形式。
需求:完成公司請假模組的開發,公司現在請假流程還是比較簡單的,只需要向自己的上級領導請示通過就可以了,公司乙個有組員,組長,總監,總經理四個職務
設計思路:
角色:定義乙個員工介面iemployees,員工根據等級劃分,請假功能:ihandler抽象處理流程類,每個職級只需要向自己的上級提交申請。請假流程方法vacate需要判斷請假員工的等級是否在自己的處理範圍之內,如果沒有,則交由自己的下一級處理。
類圖:
**實現:
package com.chain;
/** * 請假流程
*/public abstract class ihandler elseelse }}
//設定下乙個處理者
protected void setnext(ihandler ihandler)
//處理結果
protected abstract void echo();
////獲得自己職級
protected abstract string getdisposlevel();
}package com.chain;
/**責任鏈模式
* 總監
*/public class directorhandler extends ihandler
@override
protected string getdisposlevel()
}package com.chain;
public class leaderihandler extends ihandler
@override
protected string getdisposlevel()
}package com.chain;
/** * 責任鏈模式
* 經理
*/public class managerhandler extends ihandler
@override
protected string getdisposlevel()
} package com.chain;
/** * 責任鏈模式
* 員工介面
*/public inte***ce iemployees
package com.chain;
/** * 責任鏈模式
* 員工類
*/public class employees implements iemployees
@override
public string getlevel()
}package com.chain;
/** * 客戶端
*/public class client
}//執行結果
組員小三想請假
組長批准了
組長小六想請假
總監批准了
總監小九想請假
總經理批准了
總經理想請假
無符合條件的人員
從**中可以看出處理節點會先判斷是否是自己的處理範圍,如果不是會檢視是否存在下乙個節點遞迴呼叫繼續處理請求。不過這個例子有點問題,由於已經明確了職級,所以並沒有實際體現出鏈的傳遞性。(後續想到好的例子修改下)
責任鏈模式將請求和處理請求分開,請求只管請求並不清楚是誰處理請求,而處理者也無需知道請求的全面資訊,只需要判斷請求的型別才判斷是否處理。請求者和處理者解耦提高了系統的靈活性和擴充套件性。
不過劣勢也異常明顯,請求的每次處理都需要鏈的頭開始,所以鏈如果越長對效能的影響越明顯,而且如果使用遞迴的化更需要注意,遞迴一定要有出口。同時可以給鏈設定乙個閾值,保證鏈有乙個固定長度。
參考《設計模式之禪》秦小波著
一口乙個設計模式 職責鏈模式
在完成了vb.net版的機房收費系統後,感覺自己對物件導向的認識實在是太少了,所以在網上蒐集各種相關資料,添補這塊知識的空白。這不,經過乙個上午的思索,終於把職責鏈模式加入了機房收費系統,進一步加深對物件導向思想的認識。有需求才有動力,在完成機房收費系統時,有個計算消費時間的函式,當時功能是實現了,...
一天乙個設計模式 責任鏈模式
為了避免請求傳送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一物件記住其下乙個物件的引用而連成一條鏈 當有請求發生時,可將請求沿著這條鏈傳遞,直到有物件處理它為止。責任鏈模式主要包含以下角色。抽象處理者 handler 角色 定義乙個處理請求的介面,包含抽象處理方法和乙個後繼連線。具體處理...
設計模式學習之巨集觀把控
學習設計模式已經有乙個多月了,也算是學習完第一遍了。但是設計模式的全域性了解還不太清楚,接下來把自己通過自己學習,查資料以及自己的感受和認為最開始學習設計模式需要知道有那些做個總結。結合類圖,書本例項,擴充套件自己的例項,在學習的過程中每個模式基本都有例項,同過對例項的理解,自己舉例,如果自己能用自...