Go 适配器模式

273 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

适配器模式

适配器模式是一种结构设计模式,它支持具有不兼容接口的对象之间的协作。 实现这种模式,我们可以调整对象之间的行为并允许彼此工作。

就像我们的笔记本,他们的充电口不一样。Macbooke 提供的是扁圆形的Type-c 接口,window笔记本提供的是方形的 Type-A 接口。如果只有一个type-c接口充电线可能就无法两者兼容,那么就需要一个转换器。

type transport interface{
    atypeToCtype()
}


type Client struct{}
func (c *client)startSwitch(trans transport){
    fmt.Println("switch")
    trans.atypeToCtype()
}
type aType struct{}
func (a aType)atypeToCtype(){
        fmt.Println("switch aType")
}

type cType struct{}
func (c *cType)atypeToCtype(){
        fmt.Println("switch cType")
}

从上面的代码中,可以看到转换器 client、aType ,bType 它们的结构体是不一样的。 client 作为一个中间的转换接收器,接收a 或者 c 的设备,然后输出对应的接口。

或者当我们有多个数据库时,就可以使用适配器告知client 应该使用哪个数据库

type mysql struct{}
type sqllite struct{}
type mogodb struct{}


type client struct {}
func (c *client)getDriver(typeName string) interface{}{
    switch(typeName){
    case "mysql":
    return &mysql{}
    case "sqllite":
    return &sqllite{}
    case "mogodb":
    return &mongodb{}
}
}

适配器就是用来做适配,返回给client 比较合适的对象,让原来可能不兼容而无法一起工作的对象一起工作。所以在上面代码对外就可以根据类型得到适用的对象,然后就可以进行工作。

是不是觉得和代理模式一样?代理模式是在不改变原有的接口下重新定义过了一个类,实现了目标类一样的接口。但是适配器模式不一样,它提供和原始类不一样的接口。只是返回目标对象的实例,调用者最后还是直接操作目标对象。

优点和缺点

优点:

  • 可以将接口或数据转换代码与程序的主要业务逻辑分开。
  • 符合开闭设计原则。 通过接口使用适配器,可以在不修改现有代码的情况下向程序引入新类型的适配器。

缺点:

对于一些新的内容,可能需要引入一些新的接口和结构,就会导致代码的复杂性增加。

使用场景

  • 像经常需要支持多种格式的数据时,可以使用适配器模式
  • 接口升级时还需要保留旧版本接口,此时就可以通过适配器模式来兼容老版本的接口
  • 封装有缺陷的几口、封装多个接口