适配器模式(adapter)
将一个类(对象)的接口(方法或属性)转化成另外一个接口,以满足用户需求,使类(对象)之间的接口不兼容问题通过适配器得以解决。
简单来说就是通过一个中间的接口,让两个格式不兼容的类/函数/数据等能够相互兼容。举个生活中的例子,mac电脑一般没有dvi接口(就是连台式显示器的接口),只有usb接口,那这个时候我们要连显示器怎么办呢?买一个usb转dvi的转换插头,这样就能够让mac电脑使用电脑显示器了。
这就是一个适配器的例子。
代码中的例子:参数适配器
function doSomething(name,type,color,size,prize){}
// 上面的方法中有很多参数,记住这些参数的顺序是比较困难的,而且有的时候我们不需要传入所有参数
// 我们可以写一个适配器,将参数列表接口转换成对象参数接口,适配器中给出一些默认值,这样我们可以实现适配参数个数等功能
function doSomethingAdapter(obj){
let _adapter = { // 给出一个默认
name: 'bright',
type: 'superhero',
color: 'skyblue',
size: '50m',
prize: 'infinite'
}
for(let key in _adapter)
_adapter[key]=obj[key]||_adapter[key];
doSomething(obj.name,obj.type,...);
}
例子:数据适配
有时候我们得到的是数组,但是期望的是对象,这时候我们也可以使用一个适配器来进行数据格式的转换
// 假定我们得到了以下的数组
var arr = ['javascript', 'frontend', 'data structure']
// 我们希望变成这样
var obj = {
name: 'javascript',
type: 'frontend',
basic: 'data structure'
}
// 我们可以写一个下面的适配器, names表示我们希望给数组成员的名字
function adapter(arr, names){
var obj = {};
for(let item of arr){
obj[names] = item;
}
return obj;
}
// 使用
var obj = adapter(arr, ['name','type','basic']);
这种方式在我们需要在同一个数组中进行多次查找时会比较有用,如果我们用一个键来标识数组中的一个元素,那么查找的时间复杂度是O(1),如果是线性查找,时间复杂度是O(n)。
总结
适配器模式一般用于适配已有的且不太好改动的接口,比如我们前端要从后端拿数据,但是后端拿到的数据格式并不是我们所期望的,而我们又不能直接更改后端数据接口,这时候我们考虑用一个适配器来进行数据转换。
当前上面所说的都只是适配器模式的一些简单应用。我们要抓住的核心的设计思想是转换的思想,即通过一定的中间接口设计来实现我们需求。