.NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

 点击上方“DotNet NB”关注公众号

回复“1”获取开发者路线图

08fa86b129931a1f98089902c00204a7.gif

学习分享 丨作者 / 郑 子 铭    

这是DotNet NB 公众号的第180篇原创文章

目录

  • 设计原则

  • 设计模式

设计原则

  • 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 从网络监听

093d200197d0fd7fdb79c9c7cfee9af5.png

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

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

外观模式:Kestrel Server 到请求执行调度

973f80beb116cda840180f9ffbcbf2dc.png

为子系统中的一组接口提供一个一致的界面。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 中

d7d9ca818630b21a69ab21fbfda4983f.png

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

b0404e8816f13b5c71dbc5ffc75d8027.png

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

4dccfbb1af7a36687ff37ed7efa62c5a.png

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

课程链接

.NET云原生架构师训练营讲什么,怎么讲,讲多久

推荐阅读:

Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记

.NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

.NET Core开发实战(第1课:课程介绍)--学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值