快速學習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# 職責鏈模式的資料請關注腳本之家其它相關文章!

