适配器模式(js简单实现)

207 阅读2分钟

这是我参与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;
    }
};