go-nsq里的委托模式
Go的接口设计是一绝,可以把接口看做一张设计图,实现结构体的时候只要根据“设计图”的标准进行“加工”,那么该结构体的实例便可用于符合设计要求的地方。就如工厂的工程师先画好零件的设计图(interface),然后根据设计图制作零件模具(struct),这样通过模具生产出来的零件(instances)都是符合设计标准,可以用到其他地方去的。
Go的接口设计更符合现实生产的工厂模型,也给程序设计带来了更多的灵活性。通过更换相同接口的不同结构体实例,我们可以在保证整体功能方向的情况下(输入与输出格式确定),更改具体功能的实现方式。
现实里的生产关系一般是各个不同的厂家,根据相同的标准进行生产,以达到产品通用的目的。例如对于TypeC接口的安卓手机而言,只要是TypeC接口的充电线与符合当地交流电标准的充电头,就可以为手机充电(当然具体功率会有差异)。
就拿笔者手上的小米11来说,其本身除了支持最高11V5A的55W充电,还兼容其他的充电协议,例如PD3.0(27W),QC3.0(18W),如果使用Go来实现,大概就是这样的:
先有标准的TypeC充电接口统一标准:
// TypeC标准的充电接口设计
type ChargeDelegate interface {
OnCharge()
}
然后小米11根据该标准设计了充电接口:
type Mi11 struct {
//...
Charge ChargeDelegate //充电接口
//...
}
很多充电器也是根据标准设计的,当然也包括小米11的原装充电器:
// 原装充电器
type originalCharge struct{
}
func (c *originalCharge) OnCharge() {
fmt.Printf("Charging in %d power\n", 5*11) //因为是原装的,走私有协议,所以有55w的满功率输出
}
// 第三方PD充电器
type thirdPDCharge struct{
}
func (c *thirdPDCharge) OnCharge() {
fmt.Printf("Charging in %d power\n", 3*9) //因为是第三方,对接不了私有协议,所以最高只有27w
}
来模拟一下可能的使用情景:
func main