dec 7, 2014
我們來舉乙個例子,鴨子(dock)有飛(fly)和嘎嘎叫(quack)的行為,而火雞雖然也有飛(fly)的行為,但是其叫聲是咯咯的(gobble)。如果你非要火雞也要實現嘎嘎叫(quack)這個動作,那我們可以復用鴨子的 quack 方法,但是具體的叫還應該是咯咯的,此時,我們就可以建立乙個火雞的介面卡,以便讓火雞也支援 quack 方法,其內部還是要呼叫 gobble。
ok,我們開始一步一步實現,首先要先定義鴨子和火雞的抽象行為,也就是各自的方法函式:
//鴨子
var duck = function();
duck.prototype.fly = function();
duck.prototype.quack = function()
//火雞
var turkey = function();
turkey.prototype.fly = function();
turkey.prototype.gobble = function();
然後再定義具體的鴨子和火雞的建構函式,分別為:
//鴨子
var mallardduck = function () ;
mallardduck.prototype = new duck(); //原型是duck
mallardduck.prototype.fly = function () ;
mallardduck.prototype.quack = function () ;
//火雞
var wildturkey = function () ;
wildturkey.prototype = new turkey(); //原型是turkey
wildturkey.prototype.fly = function () ;
wildturkey.prototype.gobble = function () ;
為了讓火雞也支援 quack 方法,我們建立了乙個新的火雞介面卡 turkeyadapter:
var turkeyadapter = function(oturkey);
turkeyadapter.prototype = new duck();
turkeyadapter.prototype.quack = function();
turkeyadapter.prototype.fly = function()
};呼叫方法,就很明了了,測試一下便可以知道結果了:
var omallardduck = new mallardduck();
var owildturkey = new wildturkey();
var oturkeyadapter = new turkeyadapter(owildturkey);
//原有的鴨子行為
omallardduck.fly();
omallardduck.quack();
//原有的火雞行為
owildturkey.fly();
owildturkey.gobble();
//介面卡火雞的行為(火雞呼叫鴨子的方法名稱)
oturkeyadapter.fly();
oturkeyadapter.quack();
那合適使用介面卡模式好呢?如果有以下情況出現時,建議使用:
使用乙個已經存在的物件,但其方法或屬性介面不符合你的要求;
你想建立乙個可復用的物件,該物件可以與其它不相關的物件或不可見物件(即介面方法或屬性不相容的物件)協同工作;
想使用已經存在的物件,但是不能對每乙個都進行原型繼承以匹配它的介面。物件介面卡可以適配它的父物件介面方法或屬性。
另外,介面卡模式和其它幾個模式可能容易讓人迷惑,這裡說一下大概的區別:
介面卡和橋接模式雖然類似,但橋接的出發點不同,橋接的目的是將介面部分和實現部分分離,從而對他們可以更為容易也相對獨立的加以改變。而介面卡則意味著改變乙個已有物件的介面。
裝飾者模式增強了其它物件的功能而同時又不改變它的介面,因此它對應程式的透明性比介面卡要好,其結果是裝飾者支援遞迴組合,而純粹使用介面卡則是不可能的。
**模式在不改變它的介面的條件下,為另外乙個物件定義了乙個**。
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式之 介面卡模式
1,介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法一起工作的兩個類能夠在一起工作 2,介面卡模式有兩種 1 類的介面卡模式 介面卡類繼承源類 這樣介面卡類就繼承了源類有的方法 並實現目標介面,實現在源類中沒有而在介面中有的方法,從而實現介面卡類有目標介面的所有方...
設計模式之介面卡模式
介面卡模式定義 將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間。簡單定義 封裝物件,並提供不同的介面。簡單例子 鴨子介面 package headfirst.adapter.ducks public inte ce duck 具體鴨子 package headfi...