这个模式应该算是除了单例模式以外最简单的一个模式,没有多余的类,这个模式只有一个职责,就是转换的你接口参数,归一化接口调用函数,同意参数格式。
说人话~
其实就是,将不同东西,加上同一个包装。
而这个模式,我们应该早熟悉了。
在命令模式的中,有这样一段代码:

//封装命令
var MoveUp = function(exer){
    this.exer = exer;
}
MoveUp.prototype.do = function(){
    this.exer.moveUP();
}
var MoveDown = function(exer){
    this.exer = exer;
}
MoveDown.prototype.do = function(){
    this.exer.moveDown();
}
var MoveLeft = function(exer){
    this.exer = exer;
}
MoveLeft.prototype.do = function(){
    this.exer.moveLeft();
}
var MoveRight = function(exer){
    this.exer = exer;
}

在不同的命令中,我们使用类将原本接口不一致的命令适配为同一个接口的函数。而适配器的精华就体现在这里,要知道,他和代理模式一样,只起到一个中间层的作用,实质上并不会改变一个整体架构。 而我们大费周章的将他列为一个模式是很有代理的。因为在实际开发当中,我们必定会使用到一些第三方的API,有时候leader高瞻远瞩往往会使用多个相同功能的 不同提供商的 API(是不是傻啊~). 现实是,这些提供商的API要么名字不一样,要么参数不统一,但是必须要用,那就可以使用适配器模式来进行转化。
比如一个调 "评论模块" 的API
多说里面是. DS.comment().
Disqus的是. DQ.commentary().
(上面是我意淫的接口)
首先,leader的要求是,一开始使用多说的评论。(鬼信啊,万一以后你又用Disqus,那我还怎么过年)
我们这里可以使用适配器模式给自己留一条后路

var _disqus = {  //disqus评论插件
    comment(){
        disqus.commentary();
    }
}
var _DS = {  //多说评论插件
    comment(){
        DS.comment();
    }
}
var command = function(comment){
    comment.comment();
}
//使用多说的评论
command(_DS);

以后万一leader不爽多说了,想换,你也是轻而易举的。

适配器模式之数据格式转换

适配器模式不仅可以起到适配接口名的作用,它另外还有一个功能就是能统一不同格式的作用。
在某个接口中,使用的数据格式是这样的。

[{
    name:"sam",
    year:12,
    gender:"male"
}]

但是由于后台SB的不准守文档,使用了这样的格式。

{
    sam: {
        year: 12,
        gender: "male"
    },
    ...
}

但是,你的js已经按照文档的要求完成了任务标准,而此时,后台已经把后台接口写好了,估计现在度假去了。没办法,只有改动了,现在有两种选择,一种是直接破坏你原来写好的程序逻辑,还有一种是使用适配器模式直接改写。
我的话,我会选择,适!配!器!模!式!
我们可以自定义一个格式转化类

var json = {
    sam: {
        year: 12,
        gender: "male"
    },
    jimmy:{
        year:22,
        gender:"female"
    }
}
function adaption(para){
    var keys = Object.keys(para),
        obj = [];
    for(var i = 0,temp,key; key = keys[i++];){
        temp = para[key];
        temp.name = key;
        obj.push(temp);
    }
    return obj;
}
console.log(adaption(json));

然后在参数传递过程中,直接使用adaption以后的数据就可以了。

大话适配器模式

由于适配器是作为弥补的一种手段,而不是作为一开始代码设计的原则,所以,大家在代码构思的时候尽量将接口实现统一这才是最棒的模式。 我们的目的就是在程序中,不要出现适配器模式,但考虑到实际,这也是不可能的,所以尽量将代码设计符合规范是非常必要的。
ending~


villainhr
7.8k 声望2.2k 粉丝