設計模式之職責鏈模式

2021-08-14 16:29:40 字數 3307 閱讀 1204

職責鏈模式(chain of responsibility pattern)使多個物件都有機會處理請求,從而避免請求傳送者和請求的接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞請求,知道有乙個物件處理它為止。

職責鏈模式的核心思路:客戶端只需要傳送請求,職責鏈上的處理者負責處理,客戶端不用關心請求是如何處理的以及請求是如何依次傳遞的。可用來實現了對請求的過濾、攔截等操作。

職責鏈模式應用案例:struts2中的***的實現,servlet中的filter。

1.設計類圖:

(載入慢,多重新整理幾下,耐心等待……)

注:具體職責處理類(concretehandler)和抽象處理類(handler),二者是繼承關係也是聚合關係。

聚合關係:具體職責處理類(concretehandler)包含抽象處理類(handler),但抽象處理類(handler)不是具體職責處理類(concretehandler)的一部分。
1.職責處理抽象類(handler)

設計分析:職責處理抽象類提供乙個處理具體請求方法介面,並且繫結乙個職責類物件,作為當不能處理該請求時的交接物件,讓下乙個職責類嘗試處理。

package com.pattern.responsibility;

/** * 抽象的請求處理類

* */

public

abstract

class

handler

// 處理請求

public

abstract

void

handlerequest(int request);

}

2.具體職責處理類(concretehandler)

設計分析實現處理乙個具體的請求,並且當不能處理時,將請求**給職責鏈中的下乙個職責類物件。

注:這裡模擬實現三個具體職責處理類,組成乙個職責鏈,接收處理請求。

第乙個具體處理類:

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) }}

第三個具體處理類:

package com.pattern.responsibility;

/** * 具體處理類3

* */

public

class

concretehandler3

extends

handler else

if (handler != null) }}

3.客戶端(client)中用法:

設計分析:展示發起請求、命令呼叫、命令接受、命令執行的實現 。

**如下:

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) }}

6.執行結果

結果分析:在請求佇列裡的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 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將多個物件連成一條鏈,沿著這條鏈傳遞請求直到有物件處理它為止。可以定義乙個抽象類來表示處理事件的物件,這個類首先有個處理事件的抽象方法,然後提供乙個方法設定下一級處理者...