# 设计原则&&设计模式

## 目录 <a href="#mu-lu" id="mu-lu"></a>

* 设计原则
* 设计模式

### 设计原则 <a href="#she-ji-yuan-ze" id="she-ji-yuan-ze"></a>

* DRY (Don't repeat yourself 不要重复)
* KISS (Keep it stupid simple 简单到傻子都能看懂)
* YAGNI (You Aren't Gonna Need It 你不会需要它的)
* CCP 共同闭包
* CRP 共同复用
* 高内聚、低耦合
* 惯例优先配置
* SCO 关注点分离
* ADP 无依赖环
* SOLID 面向对象设计原则

#### SOLID <a href="#solid" id="solid"></a>

* S - Single-responsiblity Principle 单一职责
* O - Open-closed Principle 对修改关闭，对扩展开放
* L - Liskov Substitution Principle 里氏替换
* I - Interface Segregation Principle 接口隔离
* D - Dependency Inversion Principle 依赖反转

### 设计模式 <a href="#she-ji-mo-shi" id="she-ji-mo-shi"></a>

模式通常是指那些在一些相同的领域和上下文内，解决同样的问题。所以一定要结合具体的使用场景去了解设计模式

使用设计模式的目的是为了可重用代码，提高代码的可扩展性和可维护性

设计模式主要分为三种类型：创建型，结构型，行为型

创建型模式关注点是如何创建对象，其核心思想是要把对象的创建和使用相分离，这样使得两者能相对对立地变换

结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能，但结构型模式不仅仅简单地使用继承，而更多地通过组合与运行期的动态组合来实现更灵活的功能

行为型模式主要涉及算法和对象间的职责分配。通过使用对象组合，行为型模式可以描述一组对象应该如何协作来完成一个整体任务

| 类型  | 模式                                                                              |
| --- | ------------------------------------------------------------------------------- |
| 创建型 | 工厂方法：Factory Method；抽象工厂：Abstract Factory；建造者：Builder；原型：Prototype；单例：Singleton |
| 结构型 | 适配器；桥接；组合；装饰器；外观；享元；代理                                                          |
| 行为型 | 责任链；命令；解释器；迭代器；中介；备忘录；观察者；状态；策略；模板方法；访问者                                        |

#### 工厂方法：Kestrel Server 从网络监听 <a href="#gong-chang-fang-fa-kestrelserver-cong-wang-luo-jian-ting" id="gong-chang-fang-fa-kestrelserver-cong-wang-luo-jian-ting"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FyzYrtCpwvPhl0SMY8FAJ%2F297.jpg?alt=media\&token=40870ab5-d0ef-4d2f-ba13-1c8681301d9d)

意图：定义一个创建产品对象的工厂接口，将实际创建工作推迟到子类中

何时使用：有多种类型需要根据特定的场景进行创建实例时（或单个对象的创建过程比较复杂时）

#### 外观模式：Kestrel Server 到请求执行调度 <a href="#wai-guan-mo-shi-kestrelserver-dao-qing-qiu-zhi-hang-tiao-du" id="wai-guan-mo-shi-kestrelserver-dao-qing-qiu-zhi-hang-tiao-du"></a>

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FhVItUAEV5Sb6LXF8XGMJ%2F298.jpg?alt=media\&token=3e73930a-7170-4840-8d50-59a37020bbad)

为子系统中的一组接口提供一个一致的界面。Facade 模式定义了一个高层接口，这个接口使得这一子系统更加容易使用

符合单一职责原则，不要将过多的逻辑封装在 TransportManager 类中

KISS 原则，KEEP IT Stupid Simple

#### 源码 <a href="#yuan-ma" id="yuan-ma"></a>

<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 中

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2F96btfDBDyd67o9L2GLD1%2F299.jpg?alt=media\&token=7765440a-095b-48c5-a18f-295fbcf00466)

除了 SocketTransportFactory，还有 QuicTransportFactory，它是 HTTP/3 协议的监听器

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2Fyc94RMdD89lWMxM3TU7O%2F300.jpg?alt=media\&token=9bff4140-7f43-4946-880e-e24532c118b9)

多种实现最后都由 TransportManager 进行统一的管理

![](https://3083743005-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8gwpNo3eyzHkX0O40HRA%2Fuploads%2FM23rmaCZdoflZ0PXPgrj%2F301.jpg?alt=media\&token=b59ad975-88a0-4169-94ba-a4df32fabc05)

工厂方法符合开闭原则，后期有新的类型的时候，只需要添加新的类型和对应的工厂即可。不需要对代码逻辑进行修改
