責任鏈模式

2021-08-29 16:58:35 字數 2403 閱讀 6636

責任鏈模式的優點在於

將請求的傳送者和接受者解藕

可以簡化你的物件,因為它不需要知道鏈的結構

通過改變鏈內的成員或調動他們的次序,允許你動態的新增或刪除責任。

看以下情景:

我們都知道,在學校裡,每個學員都有這樣的請求:不去開班會,離校,退學。而每種請求必須由不同的人來處理。

那麼我們就可以寫這樣的乙個類來處理這樣的請求。

public class handlerwithoutpattern

public void handlerequest(string request) else

} else if ("導員".equals(name)) else

} else if ("校長".equals(name)) else

}else}}

那麼對於學員類,它是處理請求類的使用者,也就是它的客戶程式。那麼就有:

public class xueyuan

public static void main(string args)

}問題來了,對於現有的handlerwithoutpattern類,它只能處理以上三種請求。假如有一天,其中的某個學員提出了不同的請求,他要求處理「請假不去上課」的請求。

那麼對於寫handlerwithoutpattern類的人必須修改它寫的類以滿足這個學員的要求。於是,你不得不開啟**重新增加一段

else if ("老師".equals(name)) else

} 又或者是這個學校規定不給予退學,那麼也必須修改handlerwithoutpattern刪除掉這個處理請求。

可以說,只要有學員提出新的請求,那麼你就必須修改handlerwithoutpattern類,也就是說,處理請求的這個地方是易變化。而且對於大量的if else語句,那是相當的難以維護。這也違反了開閉原則了。

那麼以下是使用了責任鏈模式帶來的好處,它把這些處理請求各自封裝。

//定義乙個抽象處理,並有個setnexthandler(handler successor)方法,設定下乙個處理者

public abstract class handler

//處理請求,由子類完成

public abstract void handlerequest(string request);

//設定下乙個處理請求的人

public void setnexthandler(handler successor)

}//班長,他可以處理不來開班會的請求,其他請求它不能處理,將轉給下乙個處理者處理

public class banzhang extends handler

public void handlerequest(string request) else}}

//導員可以處理離校請求,對於其他請求,將交給下乙個處理者

public class daoyuan extends handler

public void handlerequest(string request)

else}}

//同理,這是校長

public class xiaozhang extends handler

public void handlerequest(string request)

else}}

對於學員類:

public class xueyuan

public static void main(string args) }}

假如,有乙個新學員,它提出了乙個新的「請假不去上課」的請求。那麼我並不需要修改現有的類,而只要增加乙個類,滿足這個新學員的需求

public class laoshi extends handler

public void handlerequest(string request)

else}}

那麼對於這個新學員它做的事情:

public class newxueyuan

public static void main(string args) }}

把這些關係,交由客戶程式(學員)來維護,增加了靈活度,假如有個學員提出的是"退學"的請求,如果他知道,這種請求只要導員或者校長才能處理,那麼就可以直接跳過班長,老師了。也就是說它可以根據學員的情況動態的增加或刪除某個處理者。

總結:將請求的傳送者和接受者解藕 //對於任何學員提出的新請求,都無須修改現有類,做的只

//是擴充套件

可以簡化你的物件,因為它不需要知道鏈的結構 //只要設定各個處理者的下乙個處理者是

//誰即可,學員無須知道各個處理者可以處理什麼,請求會被處理者鏈處理

通過改變鏈內的成員或調動他們的次序,允許你動態的新增或刪除責任。 //客戶程式可以根

//據自己的需求來決定處理者鏈

缺點:不易於觀察執行時的特徵,有礙於除錯。

並不保證請求一定被處理

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...

責任鏈模式

有3個request與3個handler,每個request由相應的handler來處理,當乙個handler與request不匹配時則傳遞給下乙個handler來處理 inte ce request class request1 implements request class request2 ...

責任鏈模式

了解了一下責任鏈模式,簡單的說下自己的理解吧 責任鏈就是說待處理的資料在request的時候,先經過filter1的處理,再經過filter2的處理,然後response時,先經過filter2的處理,在經過filter1的處理。實現思路是filterchain包括filter1和filter2,同...