20210125关于适配器到底是个啥 - ziyouzy/2021blog GitHub Wiki
适配器,我们知道充电器有适配器。可以把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结构类来封装他们,并设计统一的方法让更高层调用时拥有接口的超集特性
也可以说,还是要理解适配器的本质,适配器的实现方式并不是必须设计一个新结构类包含一个旧接口,包含一个旧结构体也是可以的