定义

  1. 适配器模式是为了解决软件实体间的接口不兼容性。使用适配器以后原本不兼容的两个软件的接口可以工作在一起了。<br />宗旨是不要改变原软件接口的程序代码,在外部使用适配器对数据结构做调整。——参考《javascript模式设计与开发实践》第17

参考demo

  1. var googleMap = {
  2. show: function()方法是show
  3. console.log( '开始渲染谷歌地图' );
  4. }
  5. };
  6. var baiduMap = {
  7. display: function(){ //方法是display
  8. console.log( '开始渲染百度地图' );
  9. }
  10. };
  11. var baiduMapAdapter = {
  12. show: function(){//适配器也改为show,返回的是display
  13. return baiduMap.display();
  14. }
  15. };
  16. //下面是渲染地图的方法,传入地图对象
  17. var renderMap = function( map ){//传入地图对象
  18. if ( map.show instanceof Function ){ //判断
  19. map.show(); //地图对象的show方法
  20. //在传入baiduMapAdapter对象的时候,调用show方法,返回的
  21. //实际是baiduMap的display方法。
  22. }
  23. };
  24. renderMap( googleMap ); // 输出:开始渲染谷歌地图
  25. renderMap( baiduMapAdapter ); // 输出:开始渲染百度地图

总结

如果有以下情况出现时,建议使用:

  • 使用一个已经存在的对象,但其方法或属性接口不符合你的要求;
  • 你想创建一个可复用的对象,该对象可以与其它不相关的对象或不可见对象(即接口方法或属性不兼容的对象)协同工作;
  • 想使用已经存在的对象,但是不能对每一个都进行原型继承以匹配它的接口。对象适配器可以适配它的父对象接口方法或属性。

    适配器模式和其它几个模式的区别

  • 配器和桥接模式虽然类似,但桥接的出发点不同,桥接的目的是将接口部分和实现部分分离,从而对他们可以更为容易也相对独立的加以改变。而适配器则意味着改变一个已有对象的接口。

  • 装饰者模式增强了其它对象的功能而同时又不改变它的接口,因此它对应程序的透明性比适配器要好,其结果是装饰者支持递归组合,而纯粹使用适配器则是不可能的。
  • 代理模式在不改变它的接口的条件下,为另外一个对象定义了一个代理。