職責鏈模式簡介及UML 職責鏈也叫責任鏈,它為請求創建了一個接收請求者對象的鏈,並將請求沿著這條鏈傳遞到目標對象去處理。 該模式最簡單的實現方式就是運用里氏替換原則,對每個職責所持有的對象進行抽象,並使得每個職責對象都擁有共同的父類,通過對外提供出具有一般意義的介面。 範例 該範例,是我在對微服務中 ...
職責鏈模式簡介及UML
職責鏈也叫責任鏈,它為請求創建了一個接收請求者對象的鏈,並將請求沿著這條鏈傳遞到目標對象去處理。
該模式最簡單的實現方式就是運用里氏替換原則,對每個職責所持有的對象進行抽象,並使得每個職責對象都擁有共同的父類,通過對外提供出具有一般意義的介面。
範例
該範例,是我在對微服務中,服務發現的容錯性進行處理的一種處理方案,考慮到服務發現過程中,如果註冊中心宕機,那麼可以使用本地文件存放的臨時性信息,如果本地文件不存在,那麼就直接用內容中存放的信息。在整個流程中,我從註冊中心獲取服務信息,然後寫入到文件中,最終存放到記憶體。
處理者抽象類
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]; }
優缺點
優點:
1、職責鏈模式將請求的發送者與接收者剝離開來,實現了雙方的解耦,而解耦後的最佳效果就是,雙方關於自有功能的定製更加簡單,修改產生的影響也大大減輕。
2、發送方調用時,無需知道鏈的結構,只需要設置好鏈路結構即可。
3、可以利用鏈路的組合特性,實現職責鏈組合的配置化,當然需要額外編寫控制代碼
缺點
1、可能會導致類文件過多,當然也有人說職責鏈會在一定程度上對系統的性能造成不利影響,不過這條我認為可以忽略,因為從系統維護的角度來說,這點犧牲是允許的。
2、如果編寫不註意,極有可能導致迴圈調用