- 簡介
使多個對象都有機會處理請求风皿,從而避免請求的發(fā)送者和接受者之間的耦合關系廊遍。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求曼氛,直到有一個對象處理它為止豁辉。
- 職責鏈的好處:
- 當客戶提交一個請求時,請求是沿鏈傳遞直至有一個 ConcreteHandler 對象負責處理它舀患。
- 鏈中的對象自己并不知道鏈的結果徽级。結果是職責鏈可簡化對象的相互連接,它們僅僅需要保持一個指向后繼者的引用聊浅,而不需要保持它所有的后選接受者的引用餐抢。降低了耦合性。
- 可以隨時增加或者修改處理一個請求的結構低匙,增強了給對象指派職責的靈活性旷痕。
- 弊端:
- 一個請求可能到最后都沒有被處理,需要考慮周全顽冶。
- 實現(xiàn)
abstract class Handler
{
protected Handler successer;
public void SetSuccessor(Handler successor){
this.successor = successor;
}
public abstract void HandleRequest(int request);
}
/*
具體處理類苦蒿,處理它所負責的請求,可訪問它的繼承者而渗稍,如果可處理該請求,
就處理之团滥,否則就講該請求轉發(fā)給它的后繼者竿屹。
*/
class ConcreteHandler1:Handler
{
public override void HandleRequest(int request){
if(request >=0&&request<10){
Console.WriteLine("{0}處理請求{1}",this.GetType().Name,request);
}else if(successor != null){
successor.HandleRequest(request);
}
}
}
class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request){
if(request>=10 &&request <20){
Console.WriteLine("{0}處理請求{1}",this.GetType().Name,request);
}
else if(successor !=null){
successor.HandleRequest(request);
}
}
}
class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request){
if(request>=20 &&request <30){
Console.WriteLine("{0}處理請求{1}",this.GetType().Name,request);
}
else if(successor !=null){
successor.HandleRequest(request);
}
}
}
static void Main(strings[] args){
/*
創(chuàng)建了三個處理者對象
h1是第一個處理者
h2被h1設置為下一個處理者
h3被 h2設置為下一個處理者
當請求符合哪個對象的處理條件,就會被當前對象處理灸姊。
*/
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int requests[] = {2,5,14,22,18,3,27,20};
foreach(int request in requests)
{
h1.HandleRequest(request);
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者