設(shè)計(jì)模式

構(gòu)造函數(shù)模式

構(gòu)造函數(shù)模式是創(chuàng)建特定類(lèi)型都對(duì)象都一種模式,通過(guò)new運(yùn)算符進(jìn)行創(chuàng)建

function Person(name,age) {
    this.name = name
    this.age = age
}
var person1 = new Person('Jack',20)
person1   //{name: 'Jack',age: 20}

這樣就創(chuàng)建了一個(gè)person對(duì)象

混合模式

混合模式同時(shí)使用了構(gòu)造函數(shù)和原型鏈,構(gòu)造函數(shù)用于定義實(shí)例都屬性,原型鏈用于定義方法和共享屬性

function Person(name,age) {
    this.name = name
    this.age = age
}
Person.prototype.sayName = function() {
    console.log(this.name)
}
//student是person都一個(gè)特例,既要擁有person的屬性和方法,也擁有屬于自己的方法
function Student(name,age,score) {
    Person.call(this,name,age)   //繼承Person的屬性
    this.score = score
}
Student.prototype = Object.create(Person.prototype)     //繼承Person的方法
Student.prototype.sayScore = function() {   //定義自己的方法
    console.log(this.score)
}

模塊模式

把功能封裝到一起,形成一個(gè)模塊,只暴露出一個(gè)調(diào)用接口,外部不能訪問(wèn)到模塊內(nèi)部

var Person = (function() {
    function _Person(name,age) {
        this.name = name
        this.age = age
    }
    _Person.prototype.sayName = function() {
        console.log(this.name)
    }
    return {
        init: function(name,age) {
            return new _Person(name,age)
        }
    }
})()
var person1 = Person.init('Jack',20)
person1 // {name: 'Jack',age: 20}
person1.sayName()  //'Jack'

工廠模式

工廠模式就是構(gòu)造函數(shù)類(lèi)似,只是工廠模式創(chuàng)建的對(duì)象不能實(shí)現(xiàn)繼承

function Person(name,age) {
    var person = {
        name: name,
        age: age
        sayName: function() {
            console.log(this.name)
        }
    }
    return person
}

因?yàn)椴粚?shí)現(xiàn)繼承,創(chuàng)建100次,就會(huì)有100個(gè)sayName方法

單例模式

一個(gè)類(lèi)能返回對(duì)象一個(gè)引用(永遠(yuǎn)是同一個(gè))和一個(gè)獲得該實(shí)例的方法(必須是靜態(tài)方法,通常使用getInstance這個(gè)名稱(chēng));當(dāng)我們調(diào)用這個(gè)方法時(shí),如果類(lèi)持有的引用不為空就返回這個(gè)引用,如果類(lèi)保持的引用為空就創(chuàng)建該類(lèi)的實(shí)例并將實(shí)例的引用賦予該類(lèi)保持的引用;同時(shí)我們還將該類(lèi)的構(gòu)造函數(shù)定義為私有方法,這樣其他處的代碼就無(wú)法通過(guò)調(diào)用該類(lèi)的構(gòu)造函數(shù)來(lái)實(shí)例化該類(lèi)的對(duì)象,只有通過(guò)該類(lèi)提供的靜態(tài)方法來(lái)得到該類(lèi)的唯一實(shí)例。

var singleton = (function(){
    var instance
    function createInstance() {
        //這個(gè)instance的屬性方法等等
    }
    return {
        getInstance: function() {
            if(!instance) {
                instance = new createInstance()
            }
            return instance
        }
    }
})()

發(fā)布訂閱模式

發(fā)布/訂閱(Publish/subscribe 或pub/sub)是一種消息范式,消息的發(fā)送者(發(fā)布者)不是計(jì)劃發(fā)送其消息給特定的接收者(訂閱者)。而是發(fā)布的消息分為不同的類(lèi)別,而不需要知道什么樣的訂閱者訂閱。訂閱者對(duì)一個(gè)或多個(gè)類(lèi)別表達(dá)興趣,于是只接收感興趣的消息,而不需要知道什么樣的發(fā)布者發(fā)布的消息。

下面是pub/sub小例子

var pubsub = (function() {
    var pubList = {}
    function on(event,handler) {
        pubList[event] = pubList[event] || []
        pubList[event].push(handler)
    }
    function trigger(event,argument) {
        var pubEvent = pubList[event]
        pubEvent.forEach(function(item,index){
            item(argument)
        })
    }
    function off(event) {
        delete pubList[event]
    }
    return {
        on,
        trigger,
        off
    }
})()

使用發(fā)布訂閱模式寫(xiě)一個(gè)事件管理器,可以實(shí)現(xiàn)如下方式調(diào)用

Event.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
Event.fire('change', '饑人谷');
Event.off('changer');
var Event = (function() {
    var pubList = {}
    function on(event,handler) {
        pubList[event] = pubList[event] || []
        pubList[event].push(handler)
    }
    function fire(event,argument) {
        var pubEvent = pubList[event]
        pubEvent.forEach(function(item,index){
            item(argument)
        })
    }
    function off(event) {
        delete pubList[event]
    }
    return {
        on,
        fire,
        off
    }
})()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容