JS實(shí)現(xiàn)前端常見(jiàn)設(shè)計(jì)模式

  1. 單例模式
    概念:?jiǎn)卫J奖WC一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)
    使用場(chǎng)景:有一些對(duì)象我們往往只需要一個(gè),比如全局緩存、瀏覽器的window對(duì)象
// 單例模式
var single = function() {
    var instance = null
    var getInstance = function () {
        if (instance === null) {
            instance = new Constructor()
        }
        return instance
    }
    var Constructor = function () {
        this.name = 'hello'
    }
    return {
        getInstance:getInstance
    }
}()
  1. 工廠模式
    概念:把相關(guān)的多個(gè)類(lèi)提供一個(gè)統(tǒng)一入口的一個(gè)模式,讓你從一個(gè)入口就可以獲得多個(gè)類(lèi)
    使用場(chǎng)景:
    (1)對(duì)象的構(gòu)建十分復(fù)雜
    (2)需要依賴(lài)具體環(huán)境創(chuàng)建不同實(shí)例
    (3)處理大量具有相同屬性的小對(duì)象
// 工廠模式
var Factory = function (type, payload) {
    // 解決 不在構(gòu)造函數(shù)前面加上new的話,會(huì)報(bào)錯(cuò)的問(wèn)題
    if (this instanceof Factory) {
        return new Factory(type, payload)
    }
    // 公用代碼
    this.name = paylod.name
    return this[type](paylod)
}
// 非公用代碼
Factory.prototype = {
    type1: function(payload) {
        //...
    },
    type2: function (payload) {
        // ...
    }
}
  1. 抽象工廠模式
    概念:在父類(lèi)里面設(shè)計(jì)好接口(沒(méi)有具體實(shí)現(xiàn)),具體的實(shí)現(xiàn)等到了子類(lèi)再重寫(xiě)
    使用場(chǎng)景:解決了子類(lèi)實(shí)現(xiàn)不規(guī)范的問(wèn)題
// 抽象工廠模式
var AbstractFactory = function () {}
AbstractFactory.prototype = {
    getName: function () {
        throw new Error('抽象方法不能調(diào)用')
    }
}
var aFactory = new AbstractFactory()
aFactory.getName()  //  Uncaught Error: 抽象方法不能調(diào)用
aFactory.getName = function () {
    return "jack"
}
aFactory.getName() //   "jack"
  1. 觀察者模式
    概念:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新,又稱(chēng)作發(fā)布訂閱模式
    使用場(chǎng)景:消息訂閱,事件監(jiān)聽(tīng)
function Publisher() {
    this.observers = []
    var state = {}
    this.getState = function () {
        return state
    }
    this.setState = function (newState) {
        state = newState
        this.notice()
    }
}

Publisher.prototype.addObserver = function (newObserver) {
    var isExist = false
    for (var i = 0; i < this.observers.length; i++) {
        if (newObserver === this.observers[i]) {
            isExist = true
            break
        }
    }
    if (!isExist)
        this.observers.push(newObserver)
    return this
}

Publisher.prototype.removeObserver = function (targetObserver) {
    for (var i = 0; i < this.observers.length; i++) {
        if (targetObserver === this.observers[i]) {
            this.observers.splice(i, 1)
            break
        }
    }
    return this
}

Publisher.prototype.notice = function () {
    for (var i = 0; i < this.observers.length; i++) {
            this.observers[i].update(this.getState())
    }
}

function Observer() {
    this.update = function (state) {
        // ...
    }
}

經(jīng)典應(yīng)用場(chǎng)景:實(shí)現(xiàn) nodejs 中的 EventEmitter

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,897評(píng)論 0 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評(píng)論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,096評(píng)論 2 59
  • ——你就算走遍大家南北,也從沒(méi)有見(jiàn)過(guò)這樣一家奇特的酒館。 酒館里,有風(fēng)情萬(wàn)種的老板娘馬紅倩,有貪婪蠢萌的廚子孟胖子...
    康遜閱讀 504評(píng)論 0 4
  • 2017.8.14 分享第28天。 今天輔導(dǎo)孩子作業(yè),其中有些數(shù)學(xué)題做錯(cuò)需要改正,但是怎么講他都不理解,一氣之下...
    鵑花開(kāi)閱讀 161評(píng)論 2 1

友情鏈接更多精彩內(nèi)容