1. 程式人生 > >設計模式のChainOfResponsibilityPattern(責任鏈模式)----行為模式

設計模式のChainOfResponsibilityPattern(責任鏈模式)----行為模式

sys 參與 task gen ted 允許 nbsp write linq

一、產生背景

    職責鏈模式是一種行為模式,為解除請求的發送者和接收者之間的耦合,而使多個對象都有機會處理這個請求。將這些對象連接成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,並且沿著這條鏈傳遞請求,直到有對象處理它為止。

二、實現方式

  職責鏈模式參與者:

  ? Handler

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

    ° 實現後繼鏈

  ? ConcreteHandler

    ° 處理其所負責的請求

    ° 可訪問其後繼者

    ° 如果可處理該請求,則處理;否則將該請求轉發給它的後繼者。

  ? Client:向鏈上的具體處理者對象提交請求

  在職責鏈模式中,Client向Handler提交請求,請求在多個ConcreteHandler對象形成的對象鏈中被傳遞,請求在傳遞的過程中被處理。

三、實例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChainOfResponsibilityPattern
{
    class Program
    {
        
static void Main(string[] args) { // Setup Chain of Responsibility Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3);
// Generate and process request int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20,1,29 }; foreach (int request in requests) { h1.HandleRequest(request); } Console.ReadLine(); } } public abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int request); } public class ConcreteHandler1 : Handler { public override void HandleRequest(int request) { if (request >= 0 && request < 10) { Console.WriteLine("{0} handled request {1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } public class ConcreteHandler2 : Handler { public override void HandleRequest(int request) { if (request >= 10 && request < 20) { Console.WriteLine("{0} handled request {1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } public class ConcreteHandler3 : Handler { public override void HandleRequest(int request) { if (request >= 20 && request < 30) { Console.WriteLine("{0} handled request {1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } }

四、設計模式分析

優點: 1、降低耦合度。它將請求的發送者和接收者解耦。 2、簡化了對象。使得對象不需要知道鏈的結構。 3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。 4、增加新的請求處理類很方便。

缺點: 1、不能保證請求一定被接收。 2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。 3、可能不容易觀察運行時的特征,有礙於除錯

設計模式のChainOfResponsibilityPattern(責任鏈模式)----行為模式