1. 程式人生 > >大話設計模式-職責鏈模式

大話設計模式-職責鏈模式

它的 活性 sso style 否則 write 地方 protected 後繼

職責鏈模式

使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。

將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

技術分享圖片

職責鏈模式的好處

當客戶提交一個請求時,請求時艷鏈傳遞直至有一個具體處理者負責處理他。

接收者和發送者都沒有地方的明確信息,且鏈中對象自己也不知道鏈的結構。

結果是職責鏈可簡化對象的相互連接,他們僅需保持一個指向其後繼者的引用,而不需保持他所有的候選者的引用。

隨時地增加或修改處理一個請求的結構,增強了給對象指派職責的靈活性。

不過一個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理。


職責鏈模式結構演示

抽象請求

定義一個處理請求的接口。

abstract class Handler
{
    protected Handler successor;
    public void SetSuccessor(Handler successor)=>this.successor=successor;
    public abstract void HandleRequest(int request);
}

具體請求

具體處理者類,負責處理他負責的請求,可訪問它的後繼者,如何可以處理就處理,否則就將請求交給他的後繼者。

class ConcreteHandler1 : Handler
{
    
public override void HandleRequest(int request) { if (request >= 0 && request < 10) Console.WriteLine($"{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($"{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($"{GetType().Name}處理請求{request}"); else if (successor != null) successor.HandleRequest(request); } }

測試結果

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 (var request in requests)
    h1.HandleRequest(request);
//測試結果
ConcreteHandler1處理請求2
ConcreteHandler1處理請求5
ConcreteHandler2處理請求14
ConcreteHandler3處理請求22
ConcreteHandler2處理請求18
ConcreteHandler1處理請求3
ConcreteHandler3處理請求27
ConcreteHandler3處理請求20

大話設計模式-職責鏈模式