这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
是什么?
在设计模式中,适配器模式属于结构型模式,是作为两个不兼容的接口之间的桥梁,是属于亡羊补牢的一种模式,让就数据能适应新的环境,不是在详细设计时添加的,而是解决正在运行的项目的问题。
为什么?
在开发的时候,你可能会遇到这样的情况,产品需要对原来的一个页面列表进行优化,添加一些不一样格式卡片,但是,原来的格式也还需要存在,这个时候,后端在进行开发的时候,发现老接口返回的数据格式很是不好,很多数据也不太需要,就提供了一个新的接口,优化了很多。
但我们前端始终都是用的同一个页面,这个时候,我们就可以使用到这个适配器模式了。
怎么做?
举个例子
我们要渲染某些人的人物列表
下面是我们最开始的人物列表
var getPeople = function () {
var people = [
{
people: 'xiaoqiang',
id: 1,
}, {
people: 'xiaopei',
id: 2,
}
];
return people;
};
var render = function (data) {
console.log('开始渲染人物的列表', data);
};
render(getPeople);
在线上稳定运行一段时间后,发现添加了很多人物,原来的数据不够可靠,然后后端进行了添加,但发现,后端返回的数据结构和正在运行在项目中的不一样
下面是新的数据结构
var people = {
xiaoqiang: 1,
xiaolin: 2,
xiaoxing: 3
};
这个时候,我们就可以用适配器去解决问题
var getPeople = function () {
var people = [
{
people: 'xiaoqiang',
id: 1,
}, {
people: 'xiaolin',
id: 2,
}
];
return people;
};
var render = function (data) {
console.log('开始渲染人物的列表', data);
};
var peopleAdapter = function( oldPeopleData ){
var peopleObj = {},
for ( let i = 0, p; p = oldPeopleData()[ i++ ]; ){
peopleObj[ p.people ] = c.id;
}
return function(){
return peopleObj;
}
};
render(peopleAdapter(getPeople));
适配器模式不需要改变已有的接口,就能够使它们协同作用。
但适配器也是有缺点的,比如,过多地使用适配器的话,会让系统变得非常凌乱。比如:看接口明明是那种格式,结果却展示了另一个接口的展示的数据。因此,如果不是很必要,可以不使用适配器。而是直接进行重构。
我看菜鸟教程上说,最好是使用继承或依赖去解决,然后网上也有相对应的实现代码
//鸭子
var MallardDuck = function () {
Duck.apply(this);
};
MallardDuck.prototype = new Duck(); //原型是Duck
MallardDuck.prototype.fly = function () {
console.log("可以飞翔很长的距离!");
};
MallardDuck.prototype.quack = function () {
console.log("嘎嘎!嘎嘎!");
};
//火鸡
var WildTurkey = function () {
Turkey.apply(this);
};
WildTurkey.prototype = new Turkey(); //原型是Turkey
WildTurkey.prototype.fly = function () {
console.log("飞翔的距离貌似有点短!");
};
WildTurkey.prototype.gobble = function () {
console.log("咯咯!咯咯!");
};
var TurkeyAdapter = function(oTurkey){
Duck.apply(this);
this.oTurkey = oTurkey;
};
TurkeyAdapter.prototype = new Duck();
TurkeyAdapter.prototype.quack = function(){
this.oTurkey.gobble();
};
TurkeyAdapter.prototype.fly = function(){
var nFly = 0;
var nLenFly = 5;
for(; nFly < nLenFly;){
this.oTurkey.fly();
nFly = nFly + 1;
}
};