有的時候在開發過程中,我們會發現,客戶端需要的接口和提供的接口發生不兼容的問題。由於特殊的原因我們無法修改客戶端接口。在這種情況下,我們需要適配現有接口和不兼容的類,這就要提到適配器模式。通過適配器,我們可以在不用修改舊代碼的情況下也能使用它們,這就是適配器的能力。
1。基本理論:
適配器模式:將一個接口轉換成客戶端需要的接口而不需要去修改客戶端代碼,使得不兼容的代碼可以一起工作。
適配器主要有3個角色組成:
(1)客戶端:調用接口的類
(2)適配器:用來連接客戶端接口和提供服務的接口的類
(3)適配者:提供服務,但是卻與客戶端接口需求不兼容服務類。
2。 簡單例子
客戶端調用一個方法進行加法計算:
var result = add(1,2);
但是我們沒有提供add這個方法,提供了同樣類似功能的sum方法:
function sum(v1,v2){ return v1 + v2; }
爲了避免修改客戶端和服務端,我們增加一個包裝函數:
function add (v1,v2){ reutrn sum(v1,v2); }
就是一個最簡單的適配器模式,我們在兩個不兼容的接口之間添加一個包裝方法,用這個方法來連接二者使其共同工作。
3。 下面我們看一下node.js中如何實現適配器模式
創建3個類:Target, Adapter,Adaptee。
3。1創建Target類,其中包含request方法。代碼如下:
/*target.js*/
module.exports = function(){
this.rquest = function(){
console.log("Target::request");
}
}
3.2 創建Adapter類,繼承Target類,並重定義request方法。代碼如下:
/*adapter.js*/
var util = require("util");
var Target = require('./target');
var Adaptee = require('./adaptee');
function Adapter(){
Target.call(this);
this.request = function(){
var adapteeObj = new Adaptee();
adapteeObj.specialRequest();
}
}
util.inherits(Adapter,Target);
module.exports = Adapter;
3.3 創建Adaptee類,實現specialRequest方法。代碼如下:
module.exports
= function(){
this.specialRequest = function(){
console.log("Adaptee::specialRequest");
}
}
3.4創建測試腳本client.js
/*client.js*/
var Adapter = require("./adapter");
var target = new Adapter();
target.request();
3.5 運行結果:
Adaptee::specialRequest