您現在的位置:首頁 > 汽車資訊 >

 javascript設計模式

發布時間: 2015-01-27 00:06


觀察者模式定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個對象的狀態發生變化時就會通知所有的觀察者對象,使得它們能夠自動更新自己。

例子:雜志訂閱

發布者包含一些方法:

var publisher = {
    subscribers:function(fn,type){
        type = type ||"any";
        if(typeof this.subscribers[type] ==="undefined"){
            this.subscribers[type] = [];
        }
        this.subsribers[type].push(fn);
    },
    unsubscribe:function(fn,type){
        this.visitSubscribers("unsubscribe",fn,type);
    },
    unsubscribe:function(publication,type){
        this.visitSubscribers("publish",publication,type);
    },
    visitSubscribers:function(function,arg,type){
        var pubtype = type || "any",
             subscribers = this.subscribers[pubtype],
             i,
             max = subscribers.length;
        for(i=0 ; i<max ; i++){
            if(action ==="publish"){
                subscribers[i](arg);
            }else{
                if(subscribers[i] === arg){
                    subscribers.splice(i,1);
                }
            }
        }
    }
};

下面的函數接受一個對象,通過把上述發布者的方法復制到該對象,將其轉化為一個發布者:

function makePublisher(o){
    var i;
    for(i in publisher){
        if(publisher.hasOwnProperty(i)&&typeof[i] ==="function"){
            o[i]=publisher[i];
        }
    }
    o.subscribers={any:[]};
}

paper對象,發布日報和月刊:

var paper={
    daily:function(){
        this.publish("big news today");
    },
    monthly:function(){
        this.publish("interesting things","monthly");
    }
};

將paper構造成發行者:

makePublisher(paper);

訂閱者joe:

var joe = {
    drinkCoffee:function(paper){
        console.log("Just read"+paper);
    },
    sundayPreNap:function(monthly){
        console.log("About to fall asleep to read this"+monthly);
    }
};

訂閱:

paper.subscribe(joe.drinkCoffee);
paper.subscribe(joe.sundayPreNap,"monthly");

觸發一些事件:

paper.daily();
paper.daily();
paper.daily();
paper.monthly();

輸出:

Just read big news today
Just read big news today
Just read big news today
About to fall asleep reading this interesting things

觀察者的使用場合是:當一個對象的改變需要同時改變其它對象,并且它不知道具體有多少對象需要改變的時候,就應該考慮使用觀察者模式。

觀察者模式所做的工作就是在解耦,讓耦合的雙方都依賴于抽象,而不是依賴于具體。從而使得各自的變化都不會影響到另一邊的變化。


興吉大二手汽車
聯系我們
百姓彩票APP 稻城县 | 宾阳县 | 宁明县 | 蒲江县 | 大同市 | 含山县 | 武强县 | 凤冈县 | 许昌市 | 呼伦贝尔市 | 泰来县 | 永平县 | 陆川县 | 英超 | 泸定县 | 哈巴河县 | 南投县 | 东港市 | 东阳市 | 龙海市 | 尉氏县 | 明光市 | 古交市 | 察隅县 | 周口市 | 长治市 | 麻江县 | 辽宁省 | 镇康县 | 广平县 | 湘阴县 | 太保市 | 安龙县 | 阿合奇县 | 黄大仙区 | 万盛区 | 宕昌县 | 沧源 | 常州市 | 怀来县 | 壶关县 | 岗巴县 | 阳新县 | 黑山县 | 易门县 | 喀喇沁旗 | 莆田市 | 策勒县 | 嘉兴市 | 永顺县 | 于田县 | 延庆县 | 闵行区 | 辉南县 | 万年县 | 金溪县 | 新余市 | 本溪市 | 民乐县 | 郓城县 | 多伦县 | 临夏县 | 阳谷县 | 土默特右旗 | 伊通 | 城步 | 儋州市 | 丹凤县 | 军事 | 高要市 | 泸水县 | 安龙县 | 丹巴县 | 普安县 | 莱芜市 | 巴林左旗 | 县级市 | 万载县 | 哈密市 | 福安市 | 汽车 | 西乌珠穆沁旗 | 青川县 | 怀安县 | 获嘉县 | 革吉县 | 家居 | 剑阁县 | 蒲城县 | 元阳县 | 英德市 | 本溪 | 密山市 | 鄂伦春自治旗 | 乐亭县 | 那曲县 | 衢州市 | 普格县 | 新竹县 | 溧水县 | 德兴市 | 溆浦县 | 凌云县 | 湘潭县 | 江北区 | 仪陇县 | 南雄市 | 西平县 | 大连市 | 蓝田县 | 都昌县 | 洛浦县 | 郑州市 | 民乐县 | 克山县 | 广宁县 | 石河子市 | 沙河市 | 永吉县 | 兴化市 | 上思县 | 揭西县 | 宿州市 | 武清区 | 东光县 | 高陵县 | 浦城县 | 深水埗区 | 延安市 | 资阳市 | 南平市 | 岑巩县 | 怀宁县 | 尉犁县 | 宝清县 | 温州市 | 阳西县 | 千阳县 | 清徐县 | 瓦房店市 | 淮北市 | 应城市 | 安阳县 | 山阴县 | 石河子市 | 文昌市 | 宁德市 | 民乐县 | 禹州市 | 正定县 | 台前县 | 台北县 | 永春县 | 华容县 | 海南省 | 南岸区 | 安顺市 | 岑巩县 | 射洪县 | 竹山县 | 万年县 | 镶黄旗 | 富民县 | 宁德市 | 饶阳县 | 会理县 | 新绛县 | 鹤壁市 | 务川 | 汾西县 | 横峰县 | 钟祥市 | 赫章县 | 贺兰县 | 乳源 | 钟山县 | 墨竹工卡县 | 秀山 | 嘉祥县 | 沽源县 | 阳高县 | 砚山县 | 五常市 | 昌宁县 | 巴中市 | 张北县 | 石狮市 | 洪雅县 | 山西省 | 乐安县 | 舞阳县 | 汕头市 | 仁布县 | 酉阳 | 广宁县 | 弋阳县 | 巢湖市 | 三都 | 信丰县 | 大宁县 | 察哈 | 杭州市 | 囊谦县 | 北安市 | 仪陇县 | 天气 | 偏关县 | 绥化市 | 湘潭县 | 彝良县 | 达日县 | 庆城县 | 镇巴县 | 屯门区 | 香格里拉县 | 通江县 | 封开县 | 龙海市 | 陇西县 | 扬州市 | 博乐市 | 新沂市 | 崇左市 | 皮山县 | 德清县 | 开封市 | 钟祥市 | 巴东县 | 广汉市 | 通海县 | 南雄市 | 滨海县 | 云霄县 | 乌拉特前旗 | 平谷区 | 柞水县 | 会同县 | 军事 | 海盐县 | 道孚县 | 绥芬河市 | 镇坪县 | 锡林浩特市 | 阿坝县 | 鄂托克前旗 | 湘阴县 | 紫金县 | 武穴市 | 内江市 | 鄱阳县 | 司法 |