什么是适配器模式 ?

把变化留给适配器,把统一留给用户。

适配器,顾名思义有了它,我们能够把原本两个不适配的东西连接起来。通常我们在开发中用于兼容接口。

适配器在生活中应用,我们知道 typec 的耳机接口是不兼容圆头的耳机的。但是此时,我们如果又买新的耳机,这太浪费。所以,我们决定购买一个 typec 转 圆头接口的转换线,这样我们就能够不够买新的耳机。

上面的案例转化成开发中的场景就是,我们现在需要使用新特性,但是新特性的语法并不兼容以前的代码。这个时候,我们就可以添加一层适配器代码,将新特性代码转换成以前代码能够支持的格式。

运用适配器模式的场景有哪些 ?

我们知道 vscode debugger 能够调试不同语言的代码,但是它们使用的ui却是一套。这是怎么回事呢?其实vscode debugger 中间添加了一层适配器,通过不同的适配器将不同代码传过来的运行信息转换成 vscode debugger 能够正确处理的信息格式。

image-20230131225029443

如何实现适配器 ?

我们现在可以知道,适配器是用来抹平差异的。所以,我们以两个功能相同调用方法不同的函数为例,将其中一个函数的实现通过适配器转化到另外一个函数中执行。

// 一个不用传入数组长度的打印数组的函数
function newPrintArray(arr) {
  arr.forEach((item) => console.log(item));
}

// 一个旧版需要传入数组长度的打印数组函数
function oldPrintArray(arr, len) {
  for (let i = 0; i < len; ++ i) {
    console.log(arr[i]);
  }
}

上面代码,我们假设 newPrintArray 是利用新特性实现的简便函数。oldPrintArray 是旧的函数并且该函数已经在项目许多地方使用。此时,我们有个需求将是将 oldPrintArray 迁移到 newPrintArray。很显然,我们不可能到处去项目中查找修改。于是,我们祭出 抹平差异化神器——适配器模式

// 一个不用传入数组长度的打印数组的函数
function newPrintArray(arr) {
  arr.forEach((item) => console.log(item));
}

// 参数列表和旧函数保持一直
function oldPrintArrayAdapter(arr, len) {
  newPrintArray(arr);
}

// 一个旧版需要传入数组长度的打印数组函数
function oldPrintArray(arr, len) {
  oldPrintArrayAdapter(arr, len);
}

上面代码中,我们只需要通过适配器模式就能够将旧的代码迁移到新的实现。very good!!!