设计模式—责任链模式
原文作者:C語言中文網(wǎng)
原文地址:責(zé)任鏈模式(職責(zé)鏈模式)詳解
目錄
1、模式的定義與特點(diǎn)
2、模式的結(jié)構(gòu)與實(shí)現(xiàn)
在現(xiàn)實(shí)生活中,一個(gè)事件需要經(jīng)過多個(gè)對象處理是很常見的場景。例如,采購審批流程、請假流程等。公司員工請假,可批假的領(lǐng)導(dǎo)有部門負(fù)責(zé)人、副總經(jīng)理、總經(jīng)理等,但每個(gè)領(lǐng)導(dǎo)能批準(zhǔn)的天數(shù)不同,員工必須根據(jù)需要請假的天數(shù)去找不同的領(lǐng)導(dǎo)簽名,也就是說員工必須記住每個(gè)領(lǐng)導(dǎo)的姓名、電話和地址等信息,這無疑增加了難度。在計(jì)算機(jī)軟硬件中也有相關(guān)例子,如總線網(wǎng)中數(shù)據(jù)報(bào)傳送,每臺計(jì)算機(jī)根據(jù)目標(biāo)地址是否同自己的地址相同來決定是否接收;還有異常處理中,處理程序根據(jù)異常的類型決定自己是否處理該異常;還有?Struts2?的攔截器、JSP?和?Servlet?的 Filter 等,所有這些,都可以考慮使用責(zé)任鏈模式來實(shí)現(xiàn)。
1、模式的定義與特點(diǎn)
責(zé)任鏈(Chain of Responsibility)模式的定義:為了避免請求發(fā)送者與多個(gè)請求處理者耦合在一起,于是將所有請求的處理者通過前一對象記住其下一個(gè)對象的引用而連成一條鏈;當(dāng)有請求發(fā)生時(shí),可將請求沿著這條鏈傳遞,直到有對象處理它為止。在責(zé)任鏈模式中,客戶只需要將請求發(fā)送到責(zé)任鏈上即可,無須關(guān)心請求的處理細(xì)節(jié)和請求的傳遞過程,請求會自動進(jìn)行傳遞。所以責(zé)任鏈將請求的發(fā)送者和請求的處理者解耦了。責(zé)任鏈模式是一種對象行為型模式,其主要優(yōu)點(diǎn)如下。
其主要缺點(diǎn)如下。
2、模式的結(jié)構(gòu)與實(shí)現(xiàn)
通常情況下,可以通過鏈表來實(shí)現(xiàn)職責(zé)鏈模式的數(shù)據(jù)結(jié)構(gòu)。
1. 模式的結(jié)構(gòu)
職責(zé)鏈模式主要包含以下角色。
責(zé)任鏈模式的本質(zhì)是解耦請求與處理,讓請求在處理鏈中能進(jìn)行傳遞與被處理;理解責(zé)任鏈模式應(yīng)當(dāng)理解其模式,而不是其具體實(shí)現(xiàn)。責(zé)任鏈模式的獨(dú)到之處是將其節(jié)點(diǎn)處理者組合成了鏈?zhǔn)浇Y(jié)構(gòu),并允許節(jié)點(diǎn)自身決定是否進(jìn)行請求處理或轉(zhuǎn)發(fā),相當(dāng)于讓請求流動起來。其結(jié)構(gòu)圖如圖 1 所示。客戶端可按圖 2 所示設(shè)置責(zé)任鏈。
圖1 責(zé)任鏈模式的結(jié)構(gòu)圖?
圖2 責(zé)任鏈2. 模式的實(shí)現(xiàn)
package chainOfResponsibility;public class ChainOfResponsibilityPattern {public static void main(String[] args) {//組裝責(zé)任鏈Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setNext(handler2);//提交請求handler1.handleRequest("two");} }//抽象處理者角色 abstract class Handler {private Handler next;public void setNext(Handler next) {this.next = next;}public Handler getNext() {return next;}//處理請求的方法public abstract void handleRequest(String request); }//具體處理者角色1 class ConcreteHandler1 extends Handler {public void handleRequest(String request) {if (request.equals("one")) {System.out.println("具體處理者1負(fù)責(zé)處理該請求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("沒有人處理該請求!");}}} }//具體處理者角色2 class ConcreteHandler2 extends Handler {public void handleRequest(String request) {if (request.equals("two")) {System.out.println("具體處理者2負(fù)責(zé)處理該請求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("沒有人處理該請求!");}}} }總結(jié)
以上是生活随笔為你收集整理的设计模式—责任链模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并查集—岛屿数量
- 下一篇: 设计模式—工厂模式之简单工厂模式