20210125关于适配器到底是个啥 - ziyouzy/2021blog GitHub Wiki

相关链接(基于java):
https://zhidao.baidu.com/question/1766291631516232100.html?qbl=relate_question_1&word=java%CA%CA%C5%E4%C6%F7%B6%BC%B0%FC%BA%AC%C4%C4%D0%A9

适配器,我们知道充电器有适配器。可以把220V的电压,转bai换成110V的电压。
Java语言中的适配器,就是可以把一种接口转换成另一种接口的对象

如一个类:

interface Door {
    void open();
    void close();
}

而我们需要另一种类:

interface MyDoor {
    void setOpen(boolean open);
}

那我们就可以写一个适配器:

class MyDoorAdapter implements MyDoor {
    private Door door;
    public MyDoorAdapter(Door door) {
        this.door = door;
    }
    public void setOpen(boolean open) {
        if (open) {
            door.open();
        } else {
            door.close();
        }
    }
}

Test:

public class Test {
    public static void main(String[] args){
        Door door = ...//假设我们已经有一个door对象了
        MyDoor myDoor = new MyDoorAdapter(door);
        myDoor.setOpen(true);//看我们已经有了一个MyDoor对象
        //适配器主要用于动态修饰对象,即有现成对象的情况下,对其进行增强或转变
    }
}

针对golang这篇文章还可以:
https://blog.csdn.net/qibin0506/article/details/50598359
但是问题在于从概念上适配器似乎是针对不同类型对象(如拥有不同功能的方法-.playmusic()和.playsound())所形成的超集(统一为.play())
而go-logger的设计模式却不太相同,因为这些不同类型(consoleAdapter、fileAdapter)从设计之初方法就高度一致,整体代码并不存在转换接口这一操作(事件)


关于大佬对此包适配器模式的设计思路:
之前思路存在一些误区,现在已经理清了,之前本以为大佬的适配器是“向上兼容”的,而其实不然,设计目的是“向下兼容” 比如console.go/AdapterConsole{}结构类,向下兼容了console.go/ConsoleWriter{}结构类
与其对应的是file.go/AdapterFile{}结构类,向下兼容了file.go/FileWriter{}
真正需要拿来做对比的其实是ConsoleWriter{}与FileWriter{} (以及ApiWrite{})
ConsoleWriter{}根本就没有设计方法,使用的都是其内部字段现成的方法 FileWriter{}则拥有:

func (fw *FileWriter) initFile() error {}
func (fw *FileWriter) writeByConfig(config *FileConfig, loggerMsg *loggerMessage) error {}
func (fw *FileWriter) sliceByDate(dataSlice string) error {}
等方法  

从这一点来说,两个底层Writer就是高度不一致的,因此才需要设计两个对应的Adapter结构类来封装他们,并设计统一的方法让更高层调用时拥有接口的超集特性
也可以说,还是要理解适配器的本质,适配器的实现方式并不是必须设计一个新结构类包含一个旧接口,包含一个旧结构体也是可以的