GO学习记录(2)
一、装饰器模式
装饰器模式主要用于在已有实现的基础上,无侵入式地增加新的功能。(完全遵循开闭原则)
比如说在接口已有实现的基础上,进一步增加了可观测性、容错之类的措施。
二、洋葱模式
装饰器模式不断叠加,就可以变成洋葱模式。
洋葱模式的特性就是不断在已有功能的基础上叠加新功能。
一般来说,越是靠近洋葱内核,就越是核心的功能。
洋葱模式完美坚持了开闭原则,并且扩展性极佳。大部分中间件的设计核心都是一个洋葱。
最为典型的应用就是你可以在初始化 sms 的时候,在最基本的具体实现上,叠加装饰器,加上可观测性、容错和鉴权之类的动能。
三、Builder 模式
Builder 模式在构建各种 middlware 和插件的时候用得多。
Builder 模式一般用于构造复杂的对象,或者说用来构造你预期会有很多变化的对象。
Builder 模式一般会结合链式调用来设计,也就是说 Builder 模式会返回 Builder 本身,直到完成整个构建。
func NewMiddlewareBuilder(fn func(ctx context.Context){}) *MiddlewareBuilder{
return &MiddlewareBuilder{
LogFunc: fn,
//默认不打印
allowReqBody: false,
}
}
//返回 Builder 本身为了链式调用
func (b *MiddlewareBuilder) AllowReqBody() *MiddlewareBuilder{
b.allowReqBody = true//请求体
return b
}
func (b *MiddlewareBuilder) AllowRespBody()*MiddlewareBuilder{
b.allowRespBody = true//响应体
return b
}
四、Option 模式
最典型的就是在 gRPC 里面,大量使用了 Option模式。
Option 模式通常有两种实现方式。
- 第一种实现方式,是利用接口来实现的。
- 第二种实现方式,是利用函数式实现的。
更加常用的是函数式实现,具体分成几个部分:
- Struct就是你要构造的复杂对象。
- StructOption:也就是所谓的 Option,它是一个函数式定义。
- WithXXX:构造一个个 Option。
- New方法:构造对象。
总结:有点复杂但是又不是特别复杂的,就用 Option;特别复杂的就用 Builder。
五、适配器模式
适配器模式一般用于将一个接口适配到另外一个接口。
适配器经常用于,版本升级的时候还要保持向后兼容性的场景中。
六、组合模式
组合模式是 GO 本身就支持的,也就是我们惯常用的组合语法而已。
这是利用组合模式来实现的装饰器:
type SmsServiceServer struct {
smsv1.UnimplementedSmsServiceServer
svc service.Service
}
这样可以控制住我们只需要装饰必要的方法,而别的方法可以不用管。
这样就可以保持 gRPC 接口的向后兼容。即便是 Protobuf 增加了新的方法,这里依旧可以编译通过。
七、责任链模式
最为典型的责任链模式,是 Gin 里面接入middleware 的方式。
可以认为,每一个 middleware 都是责任链上的一环。
好比在高速公路上定义规范,车辆过来,上高速扫码/ETC滴一下,下高速ETC再滴一下收个费,这就是拦截器模式,但是这种模式也可以看为责任链模式,当前这个链条执行完后,执行下一个链条/下一环。