職責鏈模式(chain of responsibility pattern)使多個物件都有機會處理請求,從而避免請求傳送者和請求的接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞請求,知道有乙個物件處理它為止。職責鏈模式的核心思路:客戶端只需要傳送請求,職責鏈上的處理者負責處理,客戶端不用關心請求是如何處理的以及請求是如何依次傳遞的。可用來實現了對請求的過濾、攔截等操作。
職責鏈模式應用案例:struts2中的***的實現,servlet中的filter。
1.設計類圖:
(載入慢,多重新整理幾下,耐心等待……)
注:具體職責處理類(concretehandler)和抽象處理類(handler),二者是繼承關係也是聚合關係。
聚合關係:具體職責處理類(concretehandler)包含抽象處理類(handler),但抽象處理類(handler)不是具體職責處理類(concretehandler)的一部分。
1.職責處理抽象類(handler)
設計分析:職責處理抽象類
提供乙個處理具體請求方法介面,並且繫結乙個職責類物件,作為當不能處理該請求時的交接物件,讓下乙個職責類嘗試處理。
2.具體職責處理類(concretehandler)package com.pattern.responsibility;
/** * 抽象的請求處理類
* */
public
abstract
class
handler
// 處理請求
public
abstract
void
handlerequest(int request);
}
設計分析實現處理乙個具體的請求,並且當不能處理時,將請求**給職責鏈中的下乙個職責類物件。
注:這裡模擬實現三個具體職責處理類,組成乙個職責鏈,接收處理請求。
第乙個具體處理類:
第二個具體處理類:package com.pattern.responsibility;
/** * 具體處理類1
* */
public
class
concretehandler1
extends
handler else
if (handler != null) }}
第三個具體處理類:package com.pattern.responsibility;
/** * 具體處理類2
* */
public
class
concretehandler2
extends
handler else
if (handler != null) }}
3.客戶端(client)中用法:package com.pattern.responsibility;
/** * 具體處理類3
* */
public
class
concretehandler3
extends
handler else
if (handler != null) }}
設計分析:展示發起請求、命令呼叫、命令接受、命令執行的實現 。
**如下:
6.執行結果package com.pattern.responsibility.client;
import com.pattern.responsibility.concretehandler1;
import com.pattern.responsibility.concretehandler2;
import com.pattern.responsibility.concretehandler3;
import com.pattern.responsibility.handler;
public
class
client ;
// 依次傳送請求,測試責任鏈處理請求
for (int request : requests) }}
結果分析:在請求佇列裡的15
,20
這兩個請求,由於職責鏈中沒有能夠處理的職責類,導致這兩個請求沒有被接收和執行,這也是職責鏈模式的乙個缺點,所以在應用該模式的時候,一定要把「職責類」考慮的全面些,否則會造成請求丟失的問題。
職責鏈模式為請求建立了乙個接受者物件的鏈,對請求的傳送者和接受者進行解耦,每個接受者都會包含對另乙個接受者的引用,若不能處理該請求,則傳遞給下乙個接受者,職責鏈模式屬於行為型模式。1該請求被com
.pattern
.responsibility
.concretehandler1處理
3該請求被com
.pattern
.responsibility
.concretehandler1處理
5該請求被com
.pattern
.responsibility
.concretehandler2處理
7該請求被com
.pattern
.responsibility
.concretehandler2處理
9該請求被com
.pattern
.responsibility
.concretehandler2處理
11該請求被com
.pattern
.responsibility
.concretehandler3處理
13該請求被com
.pattern
.responsibility
.concretehandler3處理
1.職責鏈模式的優點
2.職責鏈模式的缺點
設計模式之職責鏈模式
如果我們現在有乙個需求,乙個人他生了病,這個病要在 醫院才能看,但是這個病人並不清楚,就先去了一級醫院,一級醫院的醫生告訴他你的病要去二級醫院看,二級醫院也告訴他 你的病我這裡看不了,你要去 醫院才能看,最後他去 醫院把病看好了.這個過程直接寫成 class patient this.patient...
設計模式之職責鏈模式
職責鏈模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。適用場景 1 有多個的物件可以處理乙個請求,哪個物件處理該請求執行時刻自動確定 2 在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求 ...
設計模式之職責鏈模式
職責鏈模式 chain of responsibility 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將多個物件連成一條鏈,沿著這條鏈傳遞請求直到有物件處理它為止。可以定義乙個抽象類來表示處理事件的物件,這個類首先有個處理事件的抽象方法,然後提供乙個方法設定下一級處理者...