本文參考於:
設計模式課程
設計模式之適配器模式javascript
設計模式是一套被反覆使用的、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石同樣。項目中合理地運用設計模式能夠完美地解決不少問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在咱們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是設計模式能被普遍應用的緣由。java
設計模式如此強大,從今天開始,抓住大學生活的尾巴,我要一天學習一個設計模式啦。設計模式
第一個設計模式是:適配器模式。less
使用場景:
1 系統須要使用現有的類,而這些類的接口不符合系統的須要。
2 想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。
3 須要一個統一的輸出接口,而輸入端的類型不可預知。
好比插座-充電器-電子設備的例子。插座輸出的是220V的電壓,而電子設備充電時只需5V,否則就note7了,這時充電器充當適配器,接受插座的220V,輸出5V,從而做爲鏈接器讓電子設備順利充電。
總的來講適配器就是src-adapter-dist的模式,與修飾模式直接無感使用src不一樣,適配器模式使用對象變爲adapter。
適配器模式不是在系統設計時所預期的,是在需求改動、升級的時候動態添加的,若是一個系統使用過多的適配器,明明調用的是A接口,卻在適配器內部實現的是調用B接口,致使系統混亂。學習
適配器模式分爲三種:
1、類適配器模式;2、對象適配器模式;3、接口適配器模式(JS沒有抽象類的概念,這裏不詳細講述)this
接下來舉的例子就是上面插座-充電器-電子設備的例子。.net
繼承src,實現dist的接口。
先是插座prototype
function Plug() { this.V = 220; } Plug.prototype.outputVoltage220 = function() { return this.V; };
再是手機設計
function Phone() { this.V = 5; } Phone.prototype.charge = function(outputDevice) { if (outputDevice.outputVoltage5() === this.V) { console.log('充電中...'); } else { console.log('充電異常'); } };
如今咱們要實現的是outputVoltage5的接口,以對接手機的輸入電壓code
function inherit(Sub, Sup) { Sub.prototype = Object.create(Sup.prototype); Object.defineProperty(Sub.prototype, 'constructor', { enumerable: false, value: Sub }); } function Charger() { Plug.call(this); } inherit(Charger, Plug); Charger.prototype.outputVoltage5 = function() { return this.outputVoltage220() / 44; };
這樣充電器就實現了鏈接插座和手機的功能。
var cg = new Charger(); var mobile = new Phone(); mobile.charge(cg);
小結:類適配器使用繼承的方式實現,會暴露src的全部其餘方法。
對象適配器和類適配器相差不大,使用組合的方式實現。
持有src,實現dist接口,完成src->dist的適配
function Charger2() { this.plug = null; } Charger2.prototype.initPlug = function(plug) { return this.plug = plug; }; Charger2.prototype.outputVoltage5 = function() { if (!this.plug) { console.error('未插電'); return -1; } return this.plug.outputVoltage220() / 44; };
一樣也能正常充電
var plug = new Plug(); var cg2 = new Charger2(); cg2.initPlug(plug); mobile.charge(cg2);
小結:根據合成複用原則,組合優於繼承,因此結構型模式通常都是對象結構型模式。
以上表述有什麼問題,歡迎你們指出,一塊兒學習。