行為型模式之請求的鏈式處理(職責鏈模式)

2022-05-14 03:40:36 字數 2804 閱讀 6055

完整解決方案

為了讓採購單的審批流程更加靈活,並實現採購單的鏈式傳遞和處理,sunny公司開發人員使用職責鏈模式來實現採購單的分級審批,其基本結構如圖所示:

在圖

//

採購單:請求類

class

purchaserequest

//get、set方法省略

}

//

審批者類:抽象處理者

abstract

class

定義後繼物件

protected string name; //

審批者姓名

public

this.name =name;

}//設定後繼者

public

void

this.successor =successor;

}//抽象請求處理方法

public

abstract

void

processrequest(purchaserequest request);

}

//

主任類:具體處理者

class director extends

public

director(string name)

//具體請求處理方法

public

void

processrequest(purchaserequest request) else}}

//副董事長類:具體處理者

class vicepresident extends

public

vicepresident(string name)

//具體請求處理方法

public

void

processrequest(purchaserequest request) else}}

//董事長類:具體處理者

class president extends

public

president(string name)

//具體請求處理方法

public

void

processrequest(purchaserequest request) else}}

//董事會類:具體處理者

class congress extends

public

congress(string name)

//具體請求處理方法

/public

void

processrequest(purchaserequest request)

}

編寫如下客戶端測試**:

class

client

}

編譯並執行程式,輸出結果如下:

主任張無忌審批採購單:10001,金額:45000.0元,採購目的:購買倚天劍。

副董事長楊過審批採購單:10002,金額:60000.0元,採購目的:購買《葵花寶典》。

董事長郭靖審批採購單:10003,金額:160000.0元,採購目的:購買《金剛經》。

召開董事會審批採購單:10004,金額:800000.0元,採購目的:購買桃花島。

職責鏈模式總結職責鏈模式通過建立一條鏈來組織請求的處理者,請求將沿著鏈進行傳遞,請求傳送者無須知道請求在何時、何處以及如何被處理,實現了請求傳送者與處理者的解耦。在軟體開發中,如果遇到有多個物件可以處理同一請求時可以應用職責鏈模式,例如在web應用開發中建立乙個過濾器(filter)鏈來對請求資料進行過濾,在工作流系統中實現公文的分級審批等等,使用職責鏈模式可以較好地解決此類問題。

職責鏈模式的主要優點如下:

(1) 職責鏈模式使得乙個物件無須知道是其他哪乙個物件處理其請求,物件僅需知道該請求會被處理即可,接收者和傳送者都沒有對方的明確資訊,且鏈中的物件不需要知道鏈的結構,

由客戶端負責鏈的建立,降低了系統的耦合度。

(2) 請求處理物件僅需維持乙個指向其後繼者的引用,而不需要維持它對所有的候選處理者的引用,可簡化物件的相互連線。

(3) 在給物件分派職責時,職責鏈可以給我們更多的靈活性,可以通過在執行時對該鏈進行動態的增加或修改來增加或改變處理乙個請求的職責。

(4) 在系統中增加乙個新的具體請求處理者時無須修改原有系統的**,只需要在客戶端重新建鏈即可,從這一點來看是符合「開閉原則」的。

職責鏈模式的主要缺點如下:

(1) 由於乙個請求沒有明確的接收者,那麼就不能保證它一定會被處理,該請求可能一直到鏈的末端都得不到處理;乙個請求也可能因職責鏈沒有被正確配置而得不到處理。

(2) 對於比較長的職責鏈,請求的處理可能涉及到多個處理物件,系統效能將受到一定影響, 而且在進行**除錯時不太方便。

(3) 如果建鏈不當,可能會造成迴圈呼叫,將導致系統陷入死迴圈。

在以下情況下可以考慮使用職責鏈模式:

(1) 有多個物件可以處理同乙個請求,具體哪個物件處理該請求待執行時刻再確定,客戶端只需將請求提交到鏈上,而無須關心請求的處理物件是誰以及它是如何處理的。

(2) 在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求。

(3) 可動態指定一組物件處理請求,客戶端可以動態建立職責鏈來處理請求,還可以改變鏈中處理者之間的先後次序。

行為型模式 職責鏈模式

職責鏈模式 chain of responsibility pattern 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。職責鏈模式是一種物件行為型模式。它定義了乙個處理請求的介面,一般設計為抽象類,由於不同的具體...

請求的鏈式處理 職責鏈模式(三)

為了讓採購單的審批流程更加靈活,並實現採購單的鏈式傳遞和處理,sunny公司開發人員使用職責鏈模式來實現採購單的分級審批,其基本結構如圖16 3所示 採購單 請求類 class purchaserequest public void setamount double amount public do...

請求的鏈式處理 職責鏈模式(一)

一對二 過 過 這聲音熟悉嗎?你會想到什麼?對!紙牌。在類似 鬥地主 這樣的紙牌遊戲中,某人出牌給他的下家,下家看看手中的牌,如果要不起上家的牌則將出牌請求再 給他的下家,其下家再進行判斷。乙個迴圈下來,如果其他人都要不起該牌,則最初的出牌者可以打出新的牌。在這個過程中,牌作為乙個請求沿著一條鏈在傳...