適配器模式

適配器在生活中很常見秕脓,例如電源適配器雕旨、USB串口轉接設備等,它們本質上是完成接口轉換的功能悲柱。在編程領域上锋喜,模擬適配器完成接口轉換的一種解決方案叫做適配器模式。

在編程中免不了使用別人的API豌鸡,如果別人提供的API與自己期待的API存在不同的話嘿般,可以使用適配器模式把別人提供的API轉換成自己的所期待的API,這樣一來別人的代碼和自己的代碼都不需要變動涯冠。再者炉奴,日后API有所變動的話,只需要更改或替換適配器即可蛇更,這樣的解決方案符合開閉原則瞻赶,能夠大大提高代碼的可維護性。

在適配器模式中有三個角色派任,target即所期待的使用對象砸逊,也是適配器所轉換的目標,adapter即適配器掌逛,完成接口轉換的功能师逸,adaptee即被轉換的對象。具體的實現(xiàn)可以通過繼承或對象委派來實現(xiàn)颤诀,通過繼承實現(xiàn)的叫做類適配器字旭,通過對象委派實現(xiàn)的叫做對象適配器对湃,而在JS中往往通過一個函數(shù)就可以完成接口的轉換功能。

通過繼承實現(xiàn)適配器

下面是一個第三方庫:

class Painter {
  rect() {
    console.log('畫矩形')
  }
  circle() {
    console.log('畫圓形')
  }
}
module.exports = Painter

而使用者MyPainter期望的API如下:

interface IMyPainter {
  rect():void;
  circle():void;
  line():void; // 希望有一個畫直線的方法
}

由于第三方API沒有提供畫直線方法遗淳,但是又想使用第三方庫的畫矩形和畫圓形的方法拍柒,所以寫一個適配器來擴展第三方的API完成適配:

class PainterAdapter extends Painter {
   line() {
    console.log('畫直線')
   }
}

使用時:

const myPainter = new PainterAdapter()
myPainter.line();
myPainter.rect();

通過對象委派實現(xiàn)適配器

假設使用者MyPainter期望的API如下:

interface IMyPainter {
  drawRect():void;
  drawCircle():void;
}

可以看到同樣的功能在第三方庫已有實現(xiàn),但是API不太一樣屈暗,所以可以使用對象委派的方式適配第三方庫

class PainterAdapter {
  constructor() {
    this._painter = new Painter() 
 }
  drawRect(...args) {
    return this._painter.rect(...args)
  }
  drawCircle(...args) {
    return this._painter.circle(...args)
  }
}

使用時

const myPainter = new PainterAdapter()
myPainter.drawRect()
myPainter.drawCircle()

缺省適配器

當你對別人提供的API或數(shù)據(jù)不太放心的時候拆讯,可以使用缺省適配器為別人提供的API或數(shù)據(jù)設置一個默認值,這樣就不怕別人提供的格式不規(guī)范導致代碼出錯养叛。
假設你希望使用的接口還是下面這個

interface IMyPainter {
  rect():void;
  circle():void;
  line():void; // 希望有一個畫直線的方法
}

但是你不確定第三方API是否真的提供了相應的方法种呐,你可以寫一個缺省適配器使得你使用的時候總有一個默認方法:

class DefaultPainterAdapter extends Painter {
  constructor() {
     super()
     const _defaultImplement = {
       line() { console.log('default draw line') }
     }
     Object.keys(_defaultImplement).forEach((m) => {
        this[m] = this[m] || _defaultImplement[m]
     })
  }
}

接下來就可以放心使用了:

const myPainter = new DefaultPainterAdapter()
myPainter.line()
myPainter.circle()

總結

適配器模式是比較簡單也比較常用的設計模式,它的作用是為API的提供者和使用者完成接口轉換弃甥,但是也增加了代碼量爽室。API的提供者與使用者應該盡量保持一致來避免這種額外的開銷。

與外觀模式的區(qū)別

適配器模式關注的是接口轉換淆攻,使得API的提供者和使用者不必關心對方的實現(xiàn)阔墩,體現(xiàn)的是解耦的思想;而外觀模式關注的是讓API保持統(tǒng)一的接口給API的使用者使用瓶珊,體現(xiàn)的是封裝的思想啸箫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伞芹,隨后出現(xiàn)的幾起案子忘苛,更是在濱河造成了極大的恐慌,老刑警劉巖唱较,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎唾,死亡現(xiàn)場離奇詭異,居然都是意外死亡绊汹,警方通過查閱死者的電腦和手機稽屏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來西乖,“玉大人,你說我怎么就攤上這事坛增』竦瘢” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵收捣,是天一觀的道長届案。 經常有香客問我,道長罢艾,這世上最難降的妖魔是什么楣颠? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任尽纽,我火速辦了婚禮,結果婚禮上童漩,老公的妹妹穿的比我還像新娘弄贿。我一直安慰自己,他們只是感情好矫膨,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布差凹。 她就那樣靜靜地躺著,像睡著了一般侧馅。 火紅的嫁衣襯著肌膚如雪危尿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天馁痴,我揣著相機與錄音谊娇,去河邊找鬼。 笑死罗晕,一個胖子當著我的面吹牛济欢,可吹牛的內容都是我干的。 我是一名探鬼主播攀例,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼船逮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粤铭?” 一聲冷哼從身側響起挖胃,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梆惯,沒想到半個月后酱鸭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡垛吗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年凹髓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯屉。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔚舀,死狀恐怖,靈堂內的尸體忽然破棺而出锨络,到底是詐尸還是另有隱情赌躺,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布羡儿,位于F島的核電站礼患,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜缅叠,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一悄泥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肤粱,春花似錦弹囚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悯森,卻和暖如春宋舷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢姻。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工祝蝠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幻碱。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓绎狭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褥傍。 傳聞我的和親對象是個殘疾皇子儡嘶,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容