最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript觀察者模式(經典)

 更新時間:2015年12月09日 14:09:17   投稿:mrr  
Observer模式也叫觀察者模式,是由GoF提出的23種軟件設計模式的一種。Observer模式是行為模式之一,它的作用是當一個對象的狀態(tài)發(fā)生變化時,能夠自動通知其他關聯對象,自動刷新對象狀態(tài)

Observer模式也叫觀察者模式,是由GoF提出的23種軟件設計模式的一種。Observer模式是行為模式之一,它的作用是當一個對象的狀態(tài)發(fā)生變化時,能夠自動通知其他關聯對象,自動刷新對象狀態(tài)。

Observer模式的概念

Observer模式是行為模式之一,它的作用是當一個對象的狀態(tài)發(fā)生變化時,能夠自動通知其他關聯對象,自動刷新對象狀態(tài)。
Observer模式提供給關聯對象一種同步通信的手段,使某個對象與依賴它的其他對象之間保持狀態(tài)同步。

Observer模式的角色:

Subject(被觀察者)
被觀察的對象。當需要被觀察的狀態(tài)發(fā)生變化時,需要通知隊列中所有觀察者對象。Subject需要維持(添加,刪除,通知)一個觀察者對象的隊列列表。
ConcreteSubject
被觀察者的具體實現。包含一些基本的屬性狀態(tài)及其他操作。
Observer(觀察者)
接口或抽象類。當Subject的狀態(tài)發(fā)生變化時,Observer對象將通過一個callback函數得到通知。
ConcreteObserver
觀察者的具體實現。得到通知后將完成一些具體的業(yè)務邏輯處理。

觀察者模式( 又叫發(fā)布者-訂閱者模式 )應該是最常用的模式之一. 在很多語言里都得到大量應用. 包括我們平時接觸的dom事件. 也是js和dom之間實現的一種觀察者模式.

div.onclick = function click (){
alert ( ”click' )
}

只要訂閱了div的click事件. 當點擊div的時候, function click就會被觸發(fā).

那么到底什么是觀察者模式呢. 先看看生活中的觀察者模式。

好萊塢有句名言. “不要給我打電話, 我會給你打電話”. 這句話就解釋了一個觀察者模式的來龍去脈。 其中“我”是發(fā)布者, “你”是訂閱者。

再舉個例子,我來公司面試的時候,完事之后每個面試官都會對我說:“請留下你的聯系方式, 有消息我們會通知你”。 在這里“我”是訂閱者, 面試官是發(fā)布者。所以我不用每天或者每小時都去詢問面試結果, 通訊的主動權掌握在了面試官手上。而我只需要提供一個聯系方式。

觀察者模式可以很好的實現2個模塊之間的解耦。 假如我正在一個團隊里開發(fā)一個html5游戲. 當游戲開始的時候,需要加載一些圖片素材。加載好這些圖片之后開始才執(zhí)行游戲邏輯. 假設這是一個需要多人合作的項目. 我完成了Gamer和Map模塊, 而我的同事A寫了一個圖片加載器loadImage.

loadImage的代碼如下

loadImage( imgAry, function(){
Map.init();
Gamer.init();
} )

當圖片加載好之后, 再渲染地圖, 執(zhí)行游戲邏輯. 嗯, 這個程序運行良好. 突然有一天, 我想起應該給游戲加上聲音功能. 我應該讓圖片加載器添上一行代碼.

loadImage( imgAry, function(){
Map.init();
Gamer.init();
Sount.init();
} )

可是寫這個模塊的同事A去了外地旅游. 于是我打電話給他, 喂. 你的loadImage函數在哪, 我能不能改一下, 改了之后有沒有副作用. 如你所想, 各種不淡定的事發(fā)生了. 如果當初我們能這樣寫呢:

loadImage.listen( ”ready', function(){
Map.init();
})
loadImage.listen( ”ready', function(){
Gamer.init();
})
loadImage.listen( ”ready', function(){
Sount.init();
})

loadImage完成之后, 它根本不關心將來會發(fā)生什么, 因為它的工作已經完成了. 接下來它只要發(fā)布一個信號.

loadImage.trigger( ”ready' );

那么監(jiān)聽了loadImage的'ready'事件的對象都會收到通知. 就像上個面試的例子. 面試官根本不關心面試者們收到面試結果后會去哪吃飯. 他只負責把面試者的簡歷搜集到一起. 當面試結果出來時照著簡歷上的電話挨個通知.

說了這么多概念, 來一個具體的實現. 實現過程其實很簡單. 面試者把簡歷扔到一個盒子里, 然后面試官在合適的時機拿著盒子里的簡歷挨個打電話通知結果.

Events = function() {
var listen, log, obj, one, remove, trigger, __this;
obj = {};
__this = this;
listen = function( key, eventfn ) { //把簡歷扔盒子, key就是聯系方式.
var stack, _ref; //stack是盒子
stack = ( _ref = obj[key] ) != null ? _ref : obj[ key ] = [];
return stack.push( eventfn );
};
one = function( key, eventfn ) {
remove( key );
return listen( key, eventfn );
};
remove = function( key ) {
var _ref;
return ( _ref = obj[key] ) != null ? _ref.length = 0 : void 0;
};
trigger = function() { //面試官打電話通知面試者
var fn, stack, _i, _len, _ref, key;
key = Array.prototype.shift.call( arguments );
stack = ( _ref = obj[ key ] ) != null ? _ref : obj[ key ] = [];
for ( _i = 0, _len = stack.length; _i < _len; _i++ ) {
fn = stack[ _i ];
if ( fn.apply( __this, arguments ) === false) {
return false;
}
}
return {
listen: listen,
one: one,
remove: remove,
trigger: trigger
}
}

最后用觀察者模式來做一個成人電視臺的小應用.

//訂閱者
var adultTv = Event();
adultTv .listen( ”play', function( data ){
alert ( “今天是誰的電影” + data.name );
});
//發(fā)布者
adultTv .trigger( ”play', { ‘name': ‘麻生希' } )

相關文章

  • JavaScript函數式編程(Functional Programming)純函數用法分析

    JavaScript函數式編程(Functional Programming)純函數用法分析

    這篇文章主要介紹了JavaScript函數式編程(Functional Programming)純函數用法,結合實例形式分析了javascript函數式編程中純函數的函數依賴、所指透明等概念相關原理及使用技巧,需要的朋友可以參考下
    2019-05-05
  • JavaScript中幾種常見排序算法小結

    JavaScript中幾種常見排序算法小結

    JavaScript中幾種常見排序算法小結,學習js的朋友可以參考下,下面對多種方法進行了簡單的小結。
    2011-02-02
  • js 操作css實現代碼

    js 操作css實現代碼

    雖說jquery支持css選擇器,可以把一些css規(guī)則放在js里,js無論如何是比css靈活的。但是js修改的是dom的htmlelement的stlye,是一個操作而非規(guī)則。
    2009-06-06
  • createElement和onclick

    createElement和onclick

    createElement和onclick...
    2006-11-11
  • 微信網頁登錄邏輯與實現方法

    微信網頁登錄邏輯與實現方法

    這篇文章主要介紹了微信網頁登錄邏輯與實現方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 小程序實現橫向滑動日歷效果

    小程序實現橫向滑動日歷效果

    這篇文章主要介紹了小程序實現橫向滑動日歷效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • js實現響應按鈕點擊彈出可拖拽的非模態(tài)對話框完整實例【測試可用】

    js實現響應按鈕點擊彈出可拖拽的非模態(tài)對話框完整實例【測試可用】

    這篇文章主要介紹了js實現響應按鈕點擊彈出可拖拽的非模態(tài)對話框,結合完整實例形式分析了原生JavaScript實現的可拖拽非模態(tài)對話框實現技巧與使用方法,需要的朋友可以參考下
    2023-04-04
  • Js過濾空格的實現代碼

    Js過濾空格的實現代碼

    Js空格過濾代碼,這個實用性很強,可以省去用動態(tài)語言過濾字符的麻煩,減輕服務器壓力,而且JS執(zhí)行速度較快
    2013-03-03
  • 完美兼容各大瀏覽器獲取HTTP_REFERER方法總結

    完美兼容各大瀏覽器獲取HTTP_REFERER方法總結

    發(fā)現一個關于瀏覽器兼容的問題,當用JS 執(zhí)行代碼 window.location.href=”http://m.fzitv.net” 來進行跳轉的時候,Firefox 可以獲取到到HTTP_REFERER頁面,但是在IE中這一項為空
    2014-06-06
  • 原生js實現表單的正則驗證(驗證通過后才可提交)

    原生js實現表單的正則驗證(驗證通過后才可提交)

    這篇文章主要給大家介紹了關于如何利用原生js實現表單的正則驗證,所有驗證都通過后提交按鈕才可用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05

最新評論

柘荣县| 上犹县| 融水| 明水县| 增城市| 南平市| 明水县| 竹北市| 江口县| 南召县| 鞍山市| 大荔县| 海伦市| 年辖:市辖区| 宝兴县| 南召县| 建水县| 延津县| 陇川县| 辽源市| 永城市| 同仁县| 平顺县| 靖江市| 龙泉市| 无棣县| 泸州市| 宜川县| 黎城县| 泰来县| 永修县| 鄢陵县| 缙云县| 玉门市| 富宁县| 隆回县| 呼伦贝尔市| 岐山县| 连州市| 天镇县| 自治县|