最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

快速學(xué)習(xí)C# 設(shè)計模式之職責(zé)鏈模式

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

職責(zé)鏈模式簡介及UML

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

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

范例

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

處理者抽象類

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);
}

服務(wù)中心處理

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);
    }
  }
}

內(nèi)存處理

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);
  }
}

客戶端調(diào)用

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];
}

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

優(yōu)點:

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

2、發(fā)送方調(diào)用時,無需知道鏈的結(jié)構(gòu),只需要設(shè)置好鏈路結(jié)構(gòu)即可。

3、可以利用鏈路的組合特性,實現(xiàn)職責(zé)鏈組合的配置化,當(dāng)然需要額外編寫控制代碼

缺點

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

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

以上就是快速學(xué)習(xí)C# 設(shè)計模式之職責(zé)鏈模式的詳細內(nèi)容,更多關(guān)于c# 職責(zé)鏈模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#并行庫Parallel類介紹

    C#并行庫Parallel類介紹

    這篇文章介紹了C#并行庫Parallel類,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 探秘C# 6.0 的新特性

    探秘C# 6.0 的新特性

    本文的內(nèi)容包括引入C#6.0中的新的語言特性有哪些. 還有已經(jīng)被引入的代碼名稱為 “Roslyn”新編譯器. 編譯器是開放源碼的,并且可以從 codeplex 網(wǎng)站的這個地址下載到源代碼:https://roslyn.codeplex.com/.
    2015-03-03
  • C#檢查鍵盤大小寫鎖定狀態(tài)的方法

    C#檢查鍵盤大小寫鎖定狀態(tài)的方法

    這篇文章主要介紹了C#檢查鍵盤大小寫鎖定狀態(tài)的方法,涉及C#鍵盤操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#使用FolderBrowserDialog類實現(xiàn)選擇打開文件夾方法詳解

    C#使用FolderBrowserDialog類實現(xiàn)選擇打開文件夾方法詳解

    這篇文章主要介紹了C#選擇文件夾/打開文件夾/瀏覽文件夾等代碼方法,大家參考使用
    2013-11-11
  • Winform實現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    Winform實現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    這篇文章主要介紹了Winform實現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • C# 多線程對資源讀寫時如何控制的方法

    C# 多線程對資源讀寫時如何控制的方法

    這篇文章主要介紹了C# 多線程對資源讀寫時如何控制的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • C#使用鉤子獲得按鍵信息的方法

    C#使用鉤子獲得按鍵信息的方法

    這篇文章主要介紹了C#使用鉤子獲得按鍵信息的方法,實例分析了C#中鉤子的相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • C#實現(xiàn)簡單訂單管理程序

    C#實現(xiàn)簡單訂單管理程序

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單訂單管理程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c# 獲得本地ip地址的三種方法

    c# 獲得本地ip地址的三種方法

    這篇文章主要介紹了c# 獲得本地ip地址的三種方法,幫助大家更好的理解和實用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#中實現(xiàn)CAN通信的使用

    C#中實現(xiàn)CAN通信的使用

    本文主要介紹了C#中實現(xiàn)CAN通信的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評論

安西县| 中江县| 时尚| 利辛县| 溧阳市| 晋州市| 衡南县| 丹江口市| 张北县| 五华县| 兴国县| 平潭县| 洪湖市| 泰和县| 崇礼县| 江川县| 剑川县| 惠安县| 武威市| 新田县| 襄樊市| 紫阳县| 固安县| 灵台县| 双桥区| 霞浦县| 连平县| 县级市| 北京市| 远安县| 桦甸市| 翁牛特旗| 邵武市| 耒阳市| 临桂县| 泸西县| 灵武市| 宣威市| 巴东县| 安平县| 开江县|