欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

快速學習C# 設計模式之職責鏈模式

 更新時間:2020年06月24日 11:15:40   作者:艾心❤  
這篇文章主要介紹了C# 設計模式之職責鏈模式的的相關資料,文中代碼非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下

職責鏈模式簡介及UML

職責鏈也叫責任鏈,他是一種行為型模式,它為請求創(chuàng)建了一個接收請求者對象的鏈,并將請求沿著這條鏈傳遞到目標對象去處理。

該模式最簡單的實現方式就是運用里氏替換原則,對每個職責所持有的對象進行抽象,并使得每個職責對象都擁有共同的父類,通過對外提供出具有一般意義的接口。

范例

該范例,是我在對微服務中,服務發(fā)現的容錯性進行處理的一種處理方案,考慮到服務發(fā)現過程中,如果注冊中心宕機,那么可以使用本地文件存放的臨時性信息,如果本地文件不存在,那么就直接用內容中存放的信息。在整個流程中,我從注冊中心獲取服務信息,然后寫入到文件中,最終存放到內存。

處理者抽象類

internal abstract class ToleranceHandler
{
  protected ToleranceHandler handler;

  public void SetToleranceHandler(ToleranceHandler handler)
  {
    this.handler = handler;
  }

  public abstract Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request);
}

服務中心處理

internal class ConsulHandler : ToleranceHandler
{
  public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
  {
    if (request == 2)
    {
      var result = await this.GetRegisterServiceDictionary();
      return result == null ? await this.handler.HandlerRequestAsync(1) : result;
    }
    else
    {
      return await this.handler.HandlerRequestAsync(request);
    }
  }
}

文件處理

internal class FileHandler:ToleranceHandler
{
  private static readonly string fileName = "SubscribeService.json";

  public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
  {
    if (request == 0)
    {
      StreamReader sr = File.OpenText(fileName);
      string result = await sr.ReadToEndAsync();

      return result.FromJson<Dictionary<string, List<Service>>>();
    }
    else
    {
      return await this.handler.HandlerRequestAsync(request);
    }
  }
}

內存處理

internal class InMemoryHandler : ToleranceHandler
{
  public override async Task<Dictionary<string, List<Service>>> HandlerRequestAsync(int request)
  {
    if (request == 1)
    {
      IMemoryCache memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));

      var result = memoryCache.Get<Dictionary<string, List<Service>>>("ServiceRegisterDiscovery:List");

      return result == null ? await this.handler.HandlerRequestAsync(0) : result;
    }

    return await this.handler.HandlerRequestAsync(request);
  }
}

客戶端調用

public async Task<List<Service>> GetService(string serviceName)
{
  ToleranceHandler consulHandler = new ConsulHandler();  
  ToleranceHandler fileHandler = new FileHandler();
  ToleranceHandler inMemoryHandler = new InMemoryHandler();

  consulHandler.SetToleranceHandler(fileHandler);
  fileHandler.SetToleranceHandler(inMemoryHandler);

  Dictionary<string, List<Service>> serviceDic = await consulHandler.HandlerRequestAsync(2);

  return serviceDic[serviceName];
}

客戶端調用優(yōu)缺點

優(yōu)點:

1、職責鏈模式將請求的發(fā)送者與接收者剝離開來,實現了雙方的解耦,而解耦后的最佳效果就是,雙方關于自有功能的定制更加簡單,修改產生的影響也大大減輕。

2、發(fā)送方調用時,無需知道鏈的結構,只需要設置好鏈路結構即可。

3、可以利用鏈路的組合特性,實現職責鏈組合的配置化,當然需要額外編寫控制代碼

缺點

1、可能會導致類文件過多,當然也有人說職責鏈會在一定程度上對系統(tǒng)的性能造成不利影響,不過這條我認為可以忽略,因為從系統(tǒng)維護的角度來說,這點犧牲是允許的。

2、如果編寫不注意,極有可能導致循環(huán)調用

以上就是快速學習C# 設計模式之職責鏈模式的詳細內容,更多關于c# 職責鏈模式的資料請關注腳本之家其它相關文章!

相關文章

  • 判斷一個整數是否是2的N次冪實現方法

    判斷一個整數是否是2的N次冪實現方法

    下面小編就為大家分享一篇判斷一個整數是否是2的N次冪實現方法,實例簡潔,具有很好的參考價值。希望對大家有所幫助
    2017-11-11
  • C#中System.IO.Pipelines庫的使用詳解

    C#中System.IO.Pipelines庫的使用詳解

    System.IO.Pipelines 是一個庫,旨在使在 .NET 中執(zhí)行高性能 I/O 更加容易,本文主要為大家詳細介紹了System.IO.Pipelines具體使用方法,感興趣的可以了解下
    2023-12-12
  • C# using三種使用方法

    C# using三種使用方法

    這篇文章主要為大家詳細介紹了C# using三種使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • C#瀏覽器提示跨域問題解決方案

    C#瀏覽器提示跨域問題解決方案

    這篇文章主要介紹了C#瀏覽器提示跨域問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • C#多線程的ResetAbort()方法

    C#多線程的ResetAbort()方法

    這篇文章介紹了C#多線程的ResetAbort()方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# Invoke,begininvoke的用法詳解

    C# Invoke,begininvoke的用法詳解

    這篇文章主要介紹了C# Invoke,begininvoke的用法詳解,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#操作SQLite方法實例詳解

    C#操作SQLite方法實例詳解

    這篇文章主要介紹了C#操作SQLite方法,以實例形式詳細分析了C#操作SQLite的連接、查詢、插入、修改等相關技巧,需要的朋友可以參考下
    2015-06-06
  • C#簡單生成縮略圖的方法

    C#簡單生成縮略圖的方法

    這篇文章主要介紹了C#簡單生成縮略圖的方法,涉及C#操作圖片的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • Unity多語言轉換工具的實現

    Unity多語言轉換工具的實現

    這篇文章主要為大家詳細介紹了Unity多語言轉換工具的實現,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#下使用XmlDocument操作XML詳解

    C#下使用XmlDocument操作XML詳解

    本文詳細講解了C#使用XmlDocument操作XML的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論