目錄
- 設計原則
- 設計模式
設計原則
- DRY (Don't repeat yourself 不要重複)
- KISS (Keep it stupid simple 簡單到傻子都能看懂)
- YAGNI (You Aren't Gonna Need It 你不會需要它的)
- CCP 共同閉包
- CRP 共同複用
- 高內聚、低耦合
- 慣例優先配置
- SCO 關注點分離
- ADP 無依賴環
- SOLID 物件導向設計原則
SOLID
- S - Single-responsiblity Principle 單一職責
- O - Open-closed Principle 對修改關閉,對擴充套件開放
- L - Liskov Substitution Principle 里氏替換
- I - Interface Segregation Principle 介面隔離
- D - Dependency Inversion Principle 依賴反轉
設計模式
模式通常是指那些在一些相同的領域和上下文內,解決同樣的問題。所以一定要結合具體的使用場景去了解設計模式
使用設計模式的目的是為了可重用程式碼,提高程式碼的可擴充套件性和可維護性
設計模式主要分為三種型別:建立型,結構型,行為型
建立型模式關注點是如何建立物件,其核心思想是要把物件的建立和使用相分離,這樣使得兩者能相對對立地變換
結構型模式主要涉及如何組合各種物件以便獲得更好、更靈活的結構。雖然物件導向的繼承機制提供了最基本的子類擴充套件父類的功能,但結構型模式不僅僅簡單地使用繼承,而更多地通過組合與執行期的動態組合來實現更靈活的功能
行為型模式主要涉及演算法和物件間的職責分配。通過使用物件組合,行為型模式可以描述一組物件應該如何協作來完成一個整體任務
型別 | 模式 |
---|---|
建立型 | 工廠方法:Factory Method;抽象工廠:Abstract Factory;建造者:Builder;原型:Prototype;單例:Singleton |
結構型 | 介面卡;橋接;組合;裝飾器;外觀;享元;代理 |
行為型 | 責任鏈;命令;直譯器;迭代器;中介;備忘錄;觀察者;狀態;策略;模板方法;訪問者 |
工廠方法:Kestrel Server 從網路監聽
意圖:定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類中
何時使用:有多種型別需要根據特定的場景進行建立例項時(或單個物件的建立過程比較複雜時)
外觀模式:Kestrel Server 到請求執行排程
為子系統中的一組介面提供一個一致的介面。Facade 模式定義了一個高層介面,這個介面使得這一子系統更加容易使用
符合單一職責原則,不要將過多的邏輯封裝在 TransportManager 類中
KISS 原則,KEEP IT Stupid Simple
原始碼
https://github.com/dotnet/aspnetcore/
目錄 Microsoft.AspNetCore.Server.Kestrel.Core 下面的 KestrelServerImpl 類中有一個繫結方法
options.EndPoint = await _transportManager.BindAsync(options.EndPoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);
這個方法是通過 TransportManager 實現的,它是 Facade 模式,所以直接用了一個類來實現
在 TransportManager 的 StartAcceptLoop 方法中實現了繫結的功能,其實就是呼叫了其他的幾個類
private void StartAcceptLoop<T>(IConnectionListener<T> connectionListener, Func<T, Task> connectionDelegate, EndpointConfig? endpointConfig) where T : BaseConnectionContext
{
var transportConnectionManager = new TransportConnectionManager(_serviceContext.ConnectionManager);
var connectionDispatcher = new ConnectionDispatcher<T>(_serviceContext, connectionDelegate, transportConnectionManager);
var acceptLoopTask = connectionDispatcher.StartAcceptingConnections(connectionListener);
_transports.Add(new ActiveTransport(connectionListener, acceptLoopTask, transportConnectionManager, endpointConfig));
}
在 TransportManager 的繫結方法中使用了 _transportFactory,它就是 IConnectionListenerFactory
var transport = await _transportFactory.BindAsync(endPoint, cancellationToken).ConfigureAwait(false);
IConnectionListenerFactory 轉到實現可以看到 SocketTransportFactory,它在 Transport.Sockets 中
除了 SocketTransportFactory,還有 QuicTransportFactory,它是 HTTP/3 協議的監聽器
多種實現最後都由 TransportManager 進行統一的管理
工廠方法符合開閉原則,後期有新的型別的時候,只需要新增新的型別和對應的工廠即可。不需要對程式碼邏輯進行修改
課程連結
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。
如有任何疑問,請與我聯絡 (MingsonZheng@outlook.com) 。