GO学习记录2——设计模式

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再滴一下收个费,这就是拦截器模式,但是这种模式也可以看为责任链模式,当前这个链条执行完后,执行下一个链条/下一环。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值