[TOC]
# 适配器模式
将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道
## 适配器模式的应用
当百度地图和google地图提供的接口一致时
```javascript
var googleMap = {
show: function(){
console.log('开始渲染地图');
}
};
var baiduMap = {
show: function(){
console.log('开始渲染地图');
}
};
var renderMap = function(map){
if(map.show instanceof Function){
map.show();
}
};
renderMap(googleMap);
renderMap(baiduMap);
```
这时可以完美的运行着,但是当百度地图的接口发生改变时
```javascript
var googleMap = {
show: function(){
console.log('开始渲染地图');
}
};
var baiduMap = {
display: function(){
console.log('开始渲染地图');
}
};
var baiduAdapter = { // 增加 baiduAdapter 来解决问题
show: function(){
return baiduMap.display();
}
}
var renderMap = function(map){
if(map.show instanceof Function){
map.show();
}
};
renderMap(googleMap);
renderMap(baiduAdapter);
```
适配器模式的结构和装饰者模式、代理模式、外观模式都比较像,都属于“包装模式”,都是由一个对象来包装另一个对象。
- 适配器模式主要用来解决两个已有接口之间不太匹配的问题,它不考虑这些接口是怎样实现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能使它们协同作用。
- 装饰者模式和代理模式不会改变原有对象的接口,但装饰者模式的作用是为了给对象增加功能。装饰者模式常常形成一条长的装饰链,而适配模式通常只包装一次。代理模式是为了控制对象的访问,通常也只包装一次。
- 外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外观模式最显著的特点是定义了一个新的接口。