持续创作,加速成长!这是我参与「掘金日新计划 · 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 比较合适的对象,让原来可能不兼容而无法一起工作的对象一起工作。所以在上面代码对外就可以根据类型得到适用的对象,然后就可以进行工作。
是不是觉得和代理模式一样?代理模式是在不改变原有的接口下重新定义过了一个类,实现了目标类一样的接口。但是适配器模式不一样,它提供和原始类不一样的接口。只是返回目标对象的实例,调用者最后还是直接操作目标对象。
优点和缺点
优点:
- 可以将接口或数据转换代码与程序的主要业务逻辑分开。
- 符合开闭设计原则。 通过接口使用适配器,可以在不修改现有代码的情况下向程序引入新类型的适配器。
缺点:
对于一些新的内容,可能需要引入一些新的接口和结构,就会导致代码的复杂性增加。
使用场景
- 像经常需要支持多种格式的数据时,可以使用适配器模式
- 接口升级时还需要保留旧版本接口,此时就可以通过适配器模式来兼容老版本的接口
- 封装有缺陷的几口、封装多个接口