这个模式应该算是除了单例模式以外最简单的一个模式,没有多余的类,这个模式只有一个职责,就是转换的你接口参数,归一化接口调用函数,同意参数格式。
说人话~
其实就是,将不同东西,加上同一个包装。
而这个模式,我们应该早熟悉了。
在命令模式的中,有这样一段代码:
//封装命令
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~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。