W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
適配器模式(Adapter)是將一個類(對象)的接口(方法或?qū)傩裕┺D(zhuǎn)化成客戶希望的另外一個接口(方法或?qū)傩裕?,適配器模式使得原本由于接口不兼容而不能一起工作的那些類(對象)可以一些工作。速成包裝器(wrapper)。
我們來舉一個例子,鴨子(Dock)有飛(fly)和嘎嘎叫(quack)的行為,而火雞雖然也有飛(fly)的行為,但是其叫聲是咯咯的(gobble)。如果你非要火雞也要實現(xiàn)嘎嘎叫(quack)這個動作,那我們可以復(fù)用鴨子的quack方法,但是具體的叫還應(yīng)該是咯咯的,此時,我們就可以創(chuàng)建一個火雞的適配器,以便讓火雞也支持quack方法,其內(nèi)部還是要調(diào)用gobble。
OK,我們開始一步一步實現(xiàn),首先要先定義鴨子和火雞的抽象行為,也就是各自的方法函數(shù):
//鴨子 var Duck = function(){ }; Duck.prototype.fly = function(){ throw new Error("該方法必須被重寫!"); }; Duck.prototype.quack = function(){ throw new Error("該方法必須被重寫!"); } //火雞 var Turkey = function(){ }; Turkey.prototype.fly = function(){ throw new Error(" 該方法必須被重寫 !"); }; Turkey.prototype.gobble = function(){ throw new Error(" 該方法必須被重寫 !"); };
然后再定義具體的鴨子和火雞的構(gòu)造函數(shù),分別為:
//鴨子 var MallardDuck = function () { Duck.apply(this); }; MallardDuck.prototype = new Duck(); //原型是Duck MallardDuck.prototype.fly = function () { console.log("可以飛翔很長的距離!"); }; MallardDuck.prototype.quack = function () { console.log("嘎嘎!嘎嘎!"); }; //火雞 var WildTurkey = function () { Turkey.apply(this); }; WildTurkey.prototype = new Turkey(); //原型是Turkey WildTurkey.prototype.fly = function () { console.log("飛翔的距離貌似有點短!"); }; WildTurkey.prototype.gobble = function () { console.log("咯咯!咯咯!"); };
為了讓火雞也支持quack方法,我們創(chuàng)建了一個新的火雞適配器TurkeyAdapter:
var TurkeyAdapter = function(oTurkey){ Duck.apply(this); this.oTurkey = oTurkey; }; TurkeyAdapter.prototype = new Duck(); TurkeyAdapter.prototype.quack = function(){ this.oTurkey.gobble(); }; TurkeyAdapter.prototype.fly = function(){ var nFly = 0; var nLenFly = 5; for(; nFly < nLenFly;){ this.oTurkey.fly(); nFly = nFly + 1; } };
該構(gòu)造函數(shù)接受一個火雞的實例對象,然后使用Duck進行apply,其適配器原型是Duck,然后要重新修改其原型的quack方法,以便內(nèi)部調(diào)用oTurkey.gobble()方法。其fly方法也做了一些改變,讓火雞連續(xù)飛5次(內(nèi)部也是調(diào)用自身的oTurkey.fly()方法)。
調(diào)用方法,就很明了了,測試一下便可以知道結(jié)果了:
var oMallardDuck = new MallardDuck(); var oWildTurkey = new WildTurkey(); var oTurkeyAdapter = new TurkeyAdapter(oWildTurkey); //原有的鴨子行為 oMallardDuck.fly(); oMallardDuck.quack(); //原有的火雞行為 oWildTurkey.fly(); oWildTurkey.gobble(); //適配器火雞的行為(火雞調(diào)用鴨子的方法名稱) oTurkeyAdapter.fly(); oTurkeyAdapter.quack();
那合適使用適配器模式好呢?如果有以下情況出現(xiàn)時,建議使用:
另外,適配器模式和其它幾個模式可能容易讓人迷惑,這里說一下大概的區(qū)別:
參考:https://github.com/tcorral/Design-Patterns-in-Javascript/blob/master/Adapter/index.html
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: