Java设计模式——责任链模式(职责链模式)详解
模式的定義與特點(diǎn)
責(zé)任鏈(Chain of Responsibility)模式的定義:為了避免請(qǐng)求發(fā)送者與多個(gè)請(qǐng)求處理者耦合在一起,將所有請(qǐng)求的處理者通過(guò)前一對(duì)象記住其下一個(gè)對(duì)象的引用而連成一條鏈;當(dāng)有請(qǐng)求發(fā)生時(shí),可將請(qǐng)求沿著這條鏈傳遞,直到有對(duì)象處理它為止。
注意:責(zé)任鏈模式也叫職責(zé)鏈模式。
在責(zé)任鏈模式中,客戶只需要將請(qǐng)求發(fā)送到責(zé)任鏈上即可,無(wú)須關(guān)心請(qǐng)求的處理細(xì)節(jié)和請(qǐng)求的傳遞過(guò)程,所以責(zé)任鏈將請(qǐng)求的發(fā)送者和請(qǐng)求的處理者解耦了。
責(zé)任鏈模式是一種對(duì)象行為型模式,其主要優(yōu)點(diǎn)如下。
其主要缺點(diǎn)如下。
模式的結(jié)構(gòu)與實(shí)現(xiàn)
通常情況下,可以通過(guò)數(shù)據(jù)鏈表來(lái)實(shí)現(xiàn)職責(zé)鏈模式的數(shù)據(jù)結(jié)構(gòu)。
1. 模式的結(jié)構(gòu)
職責(zé)鏈模式主要包含以下角色。
其結(jié)構(gòu)圖如圖 1 所示。客戶端可按圖 2 所示設(shè)置責(zé)任鏈。
?
圖1 責(zé)任鏈模式的結(jié)構(gòu)圖
?
圖2 責(zé)任鏈
2. 模式的實(shí)現(xiàn)
職責(zé)鏈模式的實(shí)現(xiàn)代碼如下:
程序運(yùn)行結(jié)果如下:
模式的應(yīng)用實(shí)例
【例1】用責(zé)任鏈模式設(shè)計(jì)一個(gè)請(qǐng)假條審批模塊。
分析:假如規(guī)定學(xué)生請(qǐng)假小于或等于 2 天,班主任可以批準(zhǔn);小于或等于 7 天,系主任可以批準(zhǔn);小于或等于 10 天,院長(zhǎng)可以批準(zhǔn);其他情況不予批準(zhǔn);這個(gè)實(shí)例適合使用職責(zé)鏈模式實(shí)現(xiàn)。
首先,定義一個(gè)領(lǐng)導(dǎo)類(Leader),它是抽象處理者,包含了一個(gè)指向下一位領(lǐng)導(dǎo)的指針 next 和一個(gè)處理假條的抽象處理方法 handleRequest(int LeaveDays);然后,定義班主任類(ClassAdviser)、系主任類(DepartmentHead)和院長(zhǎng)類(Dean),它們是抽象處理者的子類,是具體處理者,必須根據(jù)自己的權(quán)力去實(shí)現(xiàn)父類的 handleRequest(int LeaveDays) 方法,如果無(wú)權(quán)處理就將假條交給下一位具體處理者,直到最后;客戶類負(fù)責(zé)創(chuàng)建處理鏈,并將假條交給鏈頭的具體處理者(班主任)。圖 3 所示是其結(jié)構(gòu)圖。
?
圖3 請(qǐng)假條審批模塊的結(jié)構(gòu)圖
程序代碼如下:
程序運(yùn)行結(jié)果如下:
假如增加一個(gè)教務(wù)處長(zhǎng)類,可以批準(zhǔn)學(xué)生請(qǐng)假 20 天,也非常簡(jiǎn)單,代碼如下:
模式的應(yīng)用場(chǎng)景
前邊已經(jīng)講述了關(guān)于責(zé)任鏈模式的結(jié)構(gòu)與特點(diǎn),下面介紹其應(yīng)用場(chǎng)景,責(zé)任鏈模式通常在以下幾種情況使用。
模式的擴(kuò)展
職責(zé)鏈模式存在以下兩種情況。
總結(jié)
以上是生活随笔為你收集整理的Java设计模式——责任链模式(职责链模式)详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux绑定ip mac地址,dhcp
- 下一篇: java美元兑换,(Java实现) 美元