職責鏈模式 設計模式學習

2021-09-06 08:42:48 字數 2984 閱讀 6985

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

下面給出職責鏈模式的結構圖:

下面給出職責鏈模式的基本**結構:

namespace

public

abstract

void handlerequest(int

request);

}//concretehandler1類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,就處理,否則將請求**給它的後繼者。

class

concretehandler1 : handler

處理請求

", this

.gettype().name, request);

}else

if (successor != null

) }}

//concretehandler2類,具體處理者,當請求數在10到20之間則有權處理,否則轉到下一位

class

concretehandler2 : handler

處理請求

",this

.gettype().name,request);

}else

if (successor != null

) }}

//concretehandler3類,具體處理者,當請求數在20到30之間則有權處理,否則轉到下一位

class

concretehandler3 : handler

處理請求

", this

.gettype().name, request);

}else

if (successor != null

) }}

class

program

;foreach (int request in

requests)

console.readkey();

}}

}

結果如下所示:

當客戶端提交乙個請求,請求是沿鏈傳遞直至有乙個concretehandler物件負責處理它。這就使得接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也不知道鏈的結構。結果是職責鏈可簡化物件的相互連線,他們僅需保持乙個指向其後繼的引用而不需保持它所有的候選接收者的引用。同時你也可以隨時增加或修改處理乙個請求的結構,增強了給物件指派職責的靈活性。

但是要當心,因為乙個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理。所以需要事先考慮全面。

下面回到《大話設計模式》中的加薪**:

namespace

set

}//申請內容

private

string

requestcontent;

public

string

requestcontent

set

}//數量

private

intnumber;

public

intnumber

set }}

//管理者

abstract

class

manager

//設定管理者上級

public

void

setsuperior(manager superior)

//申請請求

abstract

public

void

}//經理

class

commonmanager : manager

public

override

void

:數量被批准

", name, request.requestcontent, request.number);

}else}}

}//總監

class

majordomo : manager

public

override

void

:數量被批准

", name, request.requestcontent, request.number);

}else}}

}//總經理

class

generalmanager : manager

public

override

void

:數量被批准

", name, request.requestcontent, request.number);

}else

if (request.requesttype == "

加薪" && request.number <= 500

) :數量被批准

",name,request.requestcontent,request.number);

}else

if (request.requesttype == "

加薪" && request.number > 500

) :數量,再說吧

", name, request.requestcontent, request.number);}}

}class

program

} }

結果如圖所示:

設計模式 職責鏈(學習)

職責鏈 請求類 場景 class context private intday public intday set 剖析 首先,該模式運用的是最基本的繼承關係 1,抽象類 提供操作人的姓名,並儲存乙個該類的例項,同時提供乙個抽象的pass方法 抽象基類 abstract class handler ...

設計模式 職責鏈模式

2008年08月17日 星期日 下午 04 28 using system using system.collections.generic using system.text public officer officer o public abstract void deal action a c...

設計模式 職責鏈模式

1 request.h ifndef request h define request h include include using namespace std class request 請求類定義 endif request h 2 manager.h ifndef manager h def...