参考书籍:JavaScript设计模式
传统设计模式中,适配器模式往往是适配两个类接口不兼容的问题,然而在javascript 中,应用比较广泛,比如适配两个代码库,适配前后端数据,等等,但是更多的是应用在对象之间,为了使对象可用,通常我们会把对象拆分并重新包装。
框架比较相似的适配器,例如A 框架的代码和jQuery 代码书写比较像,就可以用window.A=A=jQuery;
适配异类框架
//定义框架
var A = A || {}
//获取元素
A.g = function (id) {
return document.getElementById(id);
}
A.on = function (id, type, fn) {
//如果传递参数是字符串则以id处理,否则以元素对象处理
var dom = typeof id === 'string' ? this.g(id) : id;
if (dom.addEventListener) {
dom.addEventListener(type, fn, false);
} else if (dom.attachEvent) {
dom.attachEvent('on' + type, fn)
} else {
dom['on' + type] = fn;
}
}
//页面点击方法
A.on(window, 'load', function () {
A.on('mybutton', 'click', function () {
//do something
})
});
//适配器--引入jQuery
A.g = function (id) {
//通过jQuery 获取jQuery对象,然后返回第一个成员
return $(id).get(0);
}
A.on = function (id, type, fn) {
var dom = typeof id === 'string' ? $('#' + id) : $(id);
dom.on(type, fn);
}
参数适配器
当调用一些方法的时候不知道传递的参数是否完整,如有些是必须的但是没有传入,一些是默认值等等,此时我们通常的做法是用适配器来参入这个参数
如下
function doSome(o) {
var adapter = {
name: 'argAdapter',
title: 'design',
color: 'purple',
size: 100,
price: 20
};
for (var i in adapter) {
adapter[i] = o[i] || adapter[i];
}
console.log(JSON.stringify(adapter));
//使用
doSome({
name: 'obj1',
title: 'test',
color: 'red',
size: 37,
price: 56
});//{"name":"obj1","title":"test","color":"red","size":37,"price":56}
doSome({
name: 'obj2',
title: 'test2',
color: 'black'
});//{"name":"obj2","title":"test2","color":"black","size":100,"price":20}
doSome({
title: 'test3',
name: 'obj3',
color: 'white'
});//{"name":"obj3","title":"test3","color":"white","size":100,"price":20}
doSome({
count: 37,
price: 56
});//{"name":"argAdapter","title":"design","color":"purple","size":100,"price":56}
}
数据适配器
服务器端数据适配器