常見(jiàn)設(shè)計(jì)模式

為什么有設(shè)計(jì)模式的概念?
1.設(shè)計(jì)模式是代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)套么,為了可重用代碼岖是,保證代碼的可靠性等.
2.設(shè)計(jì)模式主要分為三大類(lèi)型:創(chuàng)建型模式棉圈,結(jié)構(gòu)型模式和行為型模式.

1.單例模式

  • 定義:
  • 單件模式確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn).
  • 使用場(chǎng)景:
  • 用于創(chuàng)建獨(dú)一無(wú)二的碰凶,只能有一個(gè)實(shí)例的對(duì)象,單件模式給了我們一個(gè)全局的訪問(wèn)點(diǎn)鹿驼,和全局變量一樣方便又沒(méi)有全局變量的缺點(diǎn).
  • 把全局變量當(dāng)成單例來(lái)使用容易造成命名污染.
    防止命名空間污染的方法:
  • 使用命名空間
  • 使用閉包封裝私有變量
<script type="text/javascript">
    var People = (function () {//var的函數(shù)方法所以用大寫(xiě)
        var instance;
        function init() {
            //定義私有方法和屬性
            //做某事
            return {
            //定義公共方法和屬性
            };
        }
        return {
            createPeople: function () {
                if (!instance) {//只能有一份內(nèi)存的對(duì)象,有就不創(chuàng)建,沒(méi)就創(chuàng)建
                    instance = init();
                }
                return instance;
            }
        };
    }());
    var obj1 = People.createPeople();
    var obj2 = People.createPeople();

</script>

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

  • 組件,封裝,復(fù)雜.
  • JavaScript里函數(shù)有個(gè)原型屬性叫prototype欲低,當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象的時(shí)候,所有該構(gòu)造函數(shù)原型的屬性在新創(chuàng)建對(duì)象上都可用
  • 構(gòu)造函數(shù)用于創(chuàng)建特定類(lèi)型的對(duì)象,不僅聲明了使用的對(duì)象畜晰,構(gòu)造函數(shù)還可以接受參數(shù)砾莱。
  • 你可以自定義自己的構(gòu)造函數(shù),然后在里面聲明自定義類(lèi)型對(duì)象的屬性或方法.
<script type="text/javascript">
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    Person.prototype.sayName = function () {
        return this.name;
    };
    var student = new Person('tony', 20);
    console.log(student);

</script>

3.混合模式

  • 為什么使用混合模式實(shí)現(xiàn)繼承?
    實(shí)現(xiàn)對(duì)象的繼承,我們可以通過(guò)對(duì)象冒充,也可以通過(guò)原型鏈的方式.
    但是,對(duì)象冒充就要求必須使用構(gòu)造函數(shù)方式,而原型鏈則無(wú)法使用構(gòu)造函數(shù),那么,我們就綜合一下,采區(qū)混合模式來(lái)實(shí)現(xiàn)繼承.
  • 創(chuàng)建類(lèi)的最好方式,是用構(gòu)造函數(shù)定義屬性,使用原型方式定義方法.這樣的機(jī)制同樣適用于繼承機(jī)制,用對(duì)象冒充來(lái)繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對(duì)象的方法
<script type="text/javascript">
    var Person = function (name, age) {
        this.name = name;
        this.age = age;
    };
    Person.prototype.sayName = function () {
        console.log(this.name);
    }
    var Student = function (name, age, score) {
        //這里的 call作用:改變作用域,可以引用構(gòu)造函數(shù)
        Person.call(this, name, age);//this是student
        this.score = score;
        //student繼承了person的屬性
    };
    //Object.create()可以調(diào)用這個(gè)方法來(lái)創(chuàng)建一個(gè)新對(duì)象凄鼻。
    //新對(duì)象的原型就是調(diào)用 create方法時(shí)傳入的第一個(gè)參數(shù)
    Student.prototype = Object.create(Person.prototype);
    //student繼承了person的方法
    // Student.prototype = create(Person.prototype);
    // function create (parentObj){
    //     function F(){}
    //     F.prototype = parentObj;
    //     return new F();
    // };//這一段等同于上面Object.create.(Person.prototype).
    Student.prototype.sayScore = function () {
        console.log(this.score);
    }
    var student = new Student("likefool", 18, 90);
    console.log(student);//obj{屬性+方法}
    student.sayName();//'likefool'
//student繼承了person的屬性和方法
//混合模式= 構(gòu)造函數(shù)模式 + call繼承屬性

</script>

4.工廠模式

  • 使用場(chǎng)景
  • 創(chuàng)建新對(duì)象腊瑟,且該對(duì)象需要被被封裝.
    工廠模式通過(guò)讓子類(lèi)來(lái)決定該創(chuàng)建的對(duì)象是什么,來(lái)達(dá)到將對(duì)象創(chuàng)建的過(guò)程封裝的目的.
    創(chuàng)建對(duì)象的方法使用的是繼承块蚌,用于創(chuàng)建一個(gè)產(chǎn)品的實(shí)例.
<script type="text/javascript">
    function createPerson(opts) {
        var person = {
            name: opys.name || 'peter'
        };
        person.sayName = function () {
            console.log(this.name);
        }
        return person;
    }
    var p1 = createPerson({ name: 'tom' });
    var p2 = createPerson({ name: 'kite' })

</script>

5.模塊模式

  • 立即執(zhí)行函數(shù),直接return結(jié)果供外部使用,不污染全局變量
<script type="text/javascript">
var Person = (function(){
    var name = 'ruoyu';
    function sayName(){
        console.log(name);
    }
    
    return {
        name: name,
        sayName: sayName
    }
})()
Person.sayName();
</script>

6.發(fā)布訂閱模式(即觀察者模式)

  • 觀察者模式又叫發(fā)布訂閱模式闰非,它定義了一種一對(duì)多的關(guān)系盏袄,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象彩匕,這個(gè)主題對(duì)象的狀態(tài)發(fā)生變化時(shí)就會(huì)通知所有的觀察者對(duì)象,使得它們能夠自動(dòng)更新自己扬卷。
  • 使用觀察者模式的好處:
    支持簡(jiǎn)單的廣播通信纱控,自動(dòng)通知所有已經(jīng)訂閱過(guò)的對(duì)象辆毡。
    頁(yè)面載入后目標(biāo)對(duì)象很容易與觀察者存在一種動(dòng)態(tài)關(guān)聯(lián)菜秦,增加了靈活性。
  • 觀察者主要讓訂閱者與發(fā)布者解耦胚迫,發(fā)布者不需要知道哪些模塊訂閱了這個(gè)主題喷户,它只管發(fā)布這個(gè)主題就可以了,同樣訂閱者也無(wú)需知道那個(gè)模塊會(huì)發(fā)布這個(gè)主題访锻,它只管訂閱這個(gè)主題就可以了
<script type="text/javascript">
    var EventCenter = (function () {
        var events = {};
        /*
          {
            my_event: [{handler: function(data){xxx}}, {handler: function(data){yyy}}]
          }
        */
        //上面用數(shù)組保存方法的原因:這樣實(shí)現(xiàn)了一個(gè)fire調(diào)用多個(gè)方法.一對(duì)多.
        function on(evt, handler) {
            events[evt] = events[evt] || [];
            events[evt].push({
                handler: handler
            });
        }
        function fire(evt, args) {
            if (!events[evt]) {
                return;
            }
            for (var i = 0; i < events[evt].length; i++) {
                events[evt][i].handler(args);
                
            }
        }
        return {
            on: on,
            fire: fire
        }
    })();

    EventCenter.on('my_event', function (data) {
        console.log('my_event received...');
    });
    EventCenter.on('my_event', function (data) {
        console.log('my_event2 received...');
    });
    EventCenter.fire('my_event',);
//邏輯:
//最外面放一個(gè)空對(duì)象.
//A方法作用:講若干函數(shù)放入數(shù)組
//B方法:調(diào)用A里面所有的方法.
//AB怎么聯(lián)系起來(lái):通過(guò)外面的events對(duì)象,AB都是操作events對(duì)象.
//所以1對(duì)多.
</script>

參考:

7.發(fā)布訂閱模式的范例

<script type="text/javascript">
    var EventCenter = (function () {
        //外部創(chuàng)建一個(gè)可以包含數(shù)組的對(duì)象
        var events = {};
        /*
          {
            my_event: [{handler: function(data){xxx}}, {handler: function(data){yyy}}]
          }
        */
        //這里只保存方法到數(shù)組,不做操作.
        function on(evt, handler) {
            events[evt] = events[evt] || [];
            events[evt].push({
                handler: handler
            });
        }
        //對(duì)上面保存在數(shù)組里的函數(shù)做相關(guān)操作
        //重點(diǎn)是:都是對(duì)同一event對(duì)象的數(shù)組操作
        function fire(evt, args) {
            if (!events[evt]) {
                return;
            }
            for (var i = 0; i < events[evt].length; i++) {
                events[evt][i].handler(args);
            }
        }
        function off(evt) {
            delete events[evt]
        }
        return {
            on: on,
            fire: fire,
            off: off
        }
    })();
    EventCenter.on('my_event', function (data) {
        console.log('my_event received...');
    });
    EventCenter.on('my_event', function (data) {
        console.log('my_event2 received...');
    });
    EventCenter.fire('my_event');
    EventCenter.on('change', function (val) {
        console.log('change...  now val is ' + val);
    });
    EventCenter.fire('change', 'Tom');
    EventCenter.off('change');//events[change]就被刪除了
    //所以不會(huì)再調(diào)用change相關(guān)方法(通知),delete原理就是刪除數(shù)組里面的元素(即方法)
   </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褪尝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子期犬,更是在濱河造成了極大的恐慌河哑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龟虎,死亡現(xiàn)場(chǎng)離奇詭異璃谨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鲤妥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)佳吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人棉安,你說(shuō)我怎么就攤上這事底扳。” “怎么了贡耽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵衷模,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蒲赂,道長(zhǎng)阱冶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任滥嘴,我火速辦了婚禮木蹬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氏涩。我一直安慰自己届囚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布是尖。 她就那樣靜靜地躺著意系,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饺汹。 梳的紋絲不亂的頭發(fā)上蛔添,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼迎瞧。 笑死夸溶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凶硅。 我是一名探鬼主播缝裁,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼足绅!你這毒婦竟也來(lái)了捷绑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氢妈,失蹤者是張志新(化名)和其女友劉穎粹污,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體首量,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮吩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了加缘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸭叙。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拣宏,靈堂內(nèi)的尸體忽然破棺而出递雀,到底是詐尸還是另有隱情,我是刑警寧澤蚀浆,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站搜吧,受9級(jí)特大地震影響市俊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滤奈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一摆昧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜒程,春花似錦绅你、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至领炫,卻和暖如春偶垮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工似舵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脚猾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓砚哗,卻偏偏與公主長(zhǎng)得像龙助,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛛芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 工廠模式類(lèi)似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品提鸟,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式常空。簡(jiǎn)單...
    舟漁行舟閱讀 7,758評(píng)論 2 17
  • 一沽一、設(shè)計(jì)模式的起源 最早提出“設(shè)計(jì)模式”概念的是建筑設(shè)計(jì)大師亞力山大Alexander。在1970年他的《建筑的永...
    冰凡513閱讀 350評(píng)論 0 0
  • 李連杰是觀眾公認(rèn)的功夫皇帝漓糙,但隨著年齡越來(lái)越大铣缠,近幾年李連杰拍片數(shù)量在不斷減少。其實(shí)在李連杰之后有出現(xiàn)過(guò)一批很不錯(cuò)...
    吳石磊閱讀 935評(píng)論 1 7
  • 文/若杉 我身邊有很多努力的人捡硅,有的可以為了工作加班加點(diǎn),不眠不休盗棵;有的一年到頭都在打飛的到各個(gè)城市壮韭,不停的約客戶(hù)...
    若杉閱讀 2,223評(píng)論 14 48
  • 大山里的冬天,煮一鍋黑炭纹因; 就像暖爐一樣喷屋,溫暖靠近者。 圍坐著的人們瞭恰,漸漸不說(shuō)話屯曹; 或想自己的事,想想念的人惊畏。 低...
    川古閱讀 227評(píng)論 0 0