一天一個設計模式之JS實現——適配器模式

本文參考於:
設計模式課程
設計模式之適配器模式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);

小結:根據合成複用原則,組合優於繼承,因此結構型模式通常都是對象結構型模式。

以上表述有什麼問題,歡迎你們指出,一塊兒學習。

相關文章
相關標籤/搜索