意圖:使多個物件有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。這將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。
模式是給多個物件處理乙個請求的機會,從而解耦傳送者和接受者。請求沿物件鏈傳遞直至其中乙個物件處理它,如下圖所示:
從第乙個物件開始,鏈中收到請求的物件要麼親自處理,要麼**給鏈中的下乙個候選者。提交請求的物件並不明確的知道哪乙個物件將會處理它。即改請求有乙個隱式的接收者,這需要使鏈上的物件都有一致的處理請求與訪問鏈上後繼者的介面。例如handlehelp,在基類中它的預設操作是將請求**給後繼.子類可重定義提供自己的幫助,或者使用預設實現**該請求,即呼叫這個基類的方法。
適用性:
1 有多個的物件可以處理乙個請求,哪個物件處理該請求執行時刻自動確定。
2 想在不明確指定接受者的情況下,想多個物件中的乙個提交乙個請求。
3 可處理乙個請求的物件集合應被動態指定。
結構:
乙個典型的物件結構可能如下:
參與者:
handler:定義乙個處理請求的介面;(可選)實現後繼鏈。
concretehandler:
處理它所負責的請求;可訪問它的後繼者;如果可處理該請求,就處理,否則**給後繼者。
client:向鏈上的具體處理者物件提交請求。
協作:當客戶提交乙個請求時,請求沿鏈傳遞直至有乙個concretehandler物件負責處理它。
效果:1 降低耦合度:乙個物件無需知道哪乙個物件處理其請求。可簡化物件的相互連線。它們僅需保持乙個指向後繼的引用,而不需保持它所有的後選接受者的引用。
2 增強了給物件指派職責的靈活性:可以在執行時刻對該鏈進行動態的增加或修改來增加或改變處理乙個請求那些職責。
3 不保證被接受:可能有的請求到鏈的末端都得不到處理。
實現:2 連線後繼者 3 請求表示
**(又木有處理記憶體...):
//職責鏈模式
#ifndef responsibility_h
#define responsibility_h
#include using namespace std;
typedef int topic;
const topic no_help_topic = -1;
const topic print_topic = 1;
const topic *****_orientation_topic = 2;
//定義了處理幫助請求的介面
class helphandler
;//所有視窗元件都是widget抽象類的子類,widget也是helphandler
//的子類,因為所有的使用者介面元素都可有相關的幫助。
class widget : public helphandler
;class button : public widget
;class dialog : public widget
;//職責鏈的末端,不是視窗元件,是helphandler的直接子類
;#endif
#include "responsibility.h"
helphandler::helphandler(helphandler* h, topic t)
: _successer(h), _topic(t)
bool helphandler::hashelp()
void helphandler::sethandler(helphandler* h, topic t)
void helphandler::handlehelp()
widget::widget(widget* w, topic t) : helphandler(w, t)
button::button(widget* h, topic t) : widget(h, t)
//首先測試其自身是否有幫助主題,如果沒有定義,則呼叫helphandler
//中的handlehelp操作將該請求**給它的後繼者。如果有,則顯示。
void button::handlehelp()
//diaglog的後繼者不是乙個視窗元件而是任意的幫助請求處理物件。
dialog::dialog(helphandler* h, topic t) : widget(0, t)
void dialog::handlehelp()
#include "responsibility.h"
int main()
行為型模式 職責鏈模式
職責鏈模式 chain of responsibility pattern 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。職責鏈模式是一種物件行為型模式。它定義了乙個處理請求的介面,一般設計為抽象類,由於不同的具體...
行為型 職責鏈模式
定義 將請求的傳送和接收解耦,讓多個接收物件都有機會處理這個請求。將這些接收物件串成一條鏈,並沿著這條鏈傳遞這個請求,直到鏈上的某個接收物件能夠處理它為止。在職責鏈模式中,多個處理器依次處理同乙個請求。乙個請求先經過 a 處理器處理,然後再把請求傳遞給 b 處理器,b 處理器處理完後再傳遞給 c 處...
設計模式 行為型模式 職責鏈模式
採購單 請求類 class purchaserequest public void setamount double amount public double getamount public void setnumber int number public int getnumber public...