Go!Go!Go!设计模式-适配设计模式


零:前言

参考:
https://github.com/senghoo/golang-design-pattern/tree/master/02_adapter
适配器模式用于转换一种接口适配另一种接口。
实际使用中Adaptee一般为接口,并且使用工厂函数生成实例。
在Adapter中匿名组合Adaptee接口,所以Adapter类也拥有SpecificRequest实例方法,又因为Go语言中非入侵式接口特征,其实Adapter也适配Adaptee接口。


核心原理:
创建一个适配器,用在独立模块之间独立开发的场景:
模块1要求一个功能实现接口A,但是对应的功能模块定义的接口却是B,
此时就需要一个适配层:
对上,实现当前模块1的功能接口A,但并不负责实现所谓的"功能";
对下,调用真正功能模块2的功能接口B;
那么如何兼顾对上和对下呢?答: 实现接口A,内嵌接口B


步骤:
1. 上,模块开发中,制定了某个功能的接口1,对于适配器来说称为适配的目标接口
2. 下,真正实现了某个功能的另一个模块制定接口2,对于适配器来说称为被适配的目标接口
3. 适配器类, 实现适配的目标接口,接口内部调用被适配的目标实例的接口函数,

一:样例

//1. Target 是适配的目标接口
type Target interface {
    Request() string
}

//2. Adaptee 是被适配的目标接口
type Adaptee interface {
    SpecificRequest() string
}
//AdapteeImpl 是被适配的目标结构体,实现对应的接口
type adapteeImpl struct{}
func (*adapteeImpl) SpecificRequest() string {
    return "adaptee method"
}
//AdapteeFactory 是被适配接口的工厂函数,用来生成一个被是被适配的目标类实例
func AdapteeFactory() Adaptee {
    return &adapteeImpl{}
}


//3. Adapter即为适配层,转换Adaptee的接口为Target要求的接口的适配器:对外实现目标接口,内部调用被适配类实例接口方法
type adapter struct {
    Adaptee   //内嵌被适配目标接口,其隐含包括了一个同名的filed
}
func (a *adapter) Request() string {
    return a.SpecificRequest()   //****适配的核心: 在目标接口中调用被适配接口*****
}

//AdapterFactory 是Adapter的工厂函数: 给我一个向下的被适配类实例,我给你一个能够向上兼容的适配器
func AdapterFactory(adaptee Adaptee) Target {
    return &adapter{
        Adaptee: adaptee, //将底层被调用类实例作为自己的一个field
    }
}
adaptee := AdapteeFactory()
target := AdapterFactory(adaptee)
res := target.Request()