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

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

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

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

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

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

范例

該范例,是我在對(duì)微服務(wù)中,服務(wù)發(fā)現(xiàn)的容錯(cuò)性進(jìn)行處理的一種處理方案,考慮到服務(wù)發(fā)現(xiàn)過(guò)程中,如果注冊(cè)中心宕機(jī),那么可以使用本地文件存放的臨時(shí)性信息,如果本地文件不存在,那么就直接用內(nèi)容中存放的信息。在整個(gè)流程中,我從注冊(cè)中心獲取服務(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)缺點(diǎn)

優(yōu)點(diǎn):

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

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

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

缺點(diǎn)

1、可能會(huì)導(dǎo)致類文件過(guò)多,當(dāng)然也有人說(shuō)職責(zé)鏈會(huì)在一定程度上對(duì)系統(tǒng)的性能造成不利影響,不過(guò)這條我認(rèn)為可以忽略,因?yàn)閺南到y(tǒng)維護(hù)的角度來(lái)說(shuō),這點(diǎn)犧牲是允許的。

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

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

相關(guān)文章

  • C#并行庫(kù)Parallel類介紹

    C#并行庫(kù)Parallel類介紹

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

    探秘C# 6.0 的新特性

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

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

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

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

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

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

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

    C# 多線程對(duì)資源讀寫時(shí)如何控制的方法

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

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

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

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

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

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

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

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

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

最新評(píng)論

阿勒泰市| 桂东县| 多伦县| 罗平县| 玛纳斯县| 宜兴市| 宁陵县| 莎车县| 镇沅| 克山县| 无棣县| 商都县| 柳林县| 寿阳县| 新安县| 余江县| 互助| 恩施市| 肇庆市| 洛川县| 旬阳县| 苏尼特左旗| 大厂| 织金县| 罗平县| 定襄县| 蓝山县| 离岛区| 梁平县| 济宁市| 三明市| 松潘县| 南汇区| 新竹县| 营山县| 繁昌县| 长武县| 永安市| 招远市| 兴宁市| 吉隆县|