<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    [Design Pattern] The Observer Pattern

    ??? 作者:Flyingis

    ??? 在討論設計模式時,我喜歡用英文名來稱呼各種模式,覺得這樣會更為準確一些。設計模式在Java開發(fā)領域已經是炙手可熱的山芋,披上了這件戰(zhàn)袍,似乎就可以在程序設計中立于不敗之地,不僅可以規(guī)范自己的武功招式,還能夠看清其他高手的武功套路。在接下來[Design Pattern]一系列的隨筆中,我將系統(tǒng)的研究各種常用的設計模式,主要的參考資料是《Head First Design Patterns》,主要的思路是,介紹基本概念(雖然做Java開發(fā)的熟手已經對此熟悉的不得了),將思維轉換為代碼設計,談談在實際中開發(fā)的應用,也許還會有各種模式的弊端。

    ??? Observer模式是常用的幾種設計模式之一,其主要組成部分有:一組關注事件發(fā)生的對象,當事件發(fā)生時對象應該做的具體事情,以及決定對象參與或退出關注事件行為的控制器。注意,現(xiàn)在不要站在軟件設計的角度上來考慮前面的這些名詞,站在生活的角度上來看待會更為恰當。《Head First Design Patterns》中介紹的例子通俗易懂,老板決定哪些人成為他某個項目組的員工,去參與某個項目的開發(fā),當然他也可以將某員工從項目組中調離出來,或是開除。在這個過程中,員工就是關注事件發(fā)生的對象,某個項目的開發(fā)即員工應該做的具體事情,老板擁有控制與調度的權利。

    ??? Observer在程序設計中使用最為廣泛是事件響應機制。列舉《Ajax in Action》中的一段代碼:

    /* ?命名空間對象? */
    var ?jsEvent = new ?Array();

    /*
    el:DOM元素
    eventType:JavaScript事件類型,如onclick、onmousemove等
    */

    jsEvent.EventRouter
    = function (el,eventType) {
    ??
    this .lsnrs = new ?Array();
    ??
    this .el = el;
    ??el.eventRouter
    = this ;
    ??el[eventType]
    = jsEvent.EventRouter.callback;
    }


    /*
    增加一個監(jiān)聽器
    */

    jsEvent.EventRouter.prototype.addListener
    = function (lsnr) {
    ??
    this .lsnrs.append(lsnr, true );
    }


    /*
    去除一個監(jiān)聽器
    */

    jsEvent.EventRouter.prototype.removeListener
    = function (lsnr) {
    ??
    this .lsnrs.remove(lsnr);
    }


    /*
    通知所有需要響應事件的方法,當事件產生時即調用這些方法
    */

    jsEvent.EventRouter.prototype.notify
    = function (e) {
    ??
    var ?lsnrs = this .lsnrs;
    ??
    for ( var ?i = 0 ;i < lsnrs.length;i ++ ) {
    ????
    var ?lsnr = lsnrs[i];
    ????lsnr.call(
    this ,e);
    ??}

    }


    /*
    定義事件回調函數,this指向DOM元素
    */

    jsEvent.EventRouter.callback
    = function (event) {
    ??
    var ?e = event? || ?window.event;
    ??
    var ?router = this .eventRouter;
    ??router.notify(e)
    }

    ??? 其中,關注事件發(fā)生的對象是lsnr,被保存在一系列的數組lsnrs中。事件產生時應該做的具體事情在notify方法體現(xiàn)。控制器則是removeListener和addListener來完成,它們決定需要哪些對象來關注事件的發(fā)生(這里說的“對象”仍然是廣義的,非面向對象中的“對象”)。這樣就完成了一個簡單的JavaScript事件響應的設計,遵循的是Observer設計模式。

    ??? Java API內建了一些接口、類來幫助實現(xiàn)Observer模式,具體可以參考java.util包中的Observer接口和Observable類。

    ??? Observer模式在軟件設計中使用的非常廣泛,在事件響應、對象監(jiān)控、動態(tài)響應等領域具有重要的實際應用價值,除此之外,它還可以有效幫助軟件設計向Loosely Coupled Design方向發(fā)展,降低模塊之間的耦合,順應軟件設計發(fā)展的潮流。但是,對于一個簡單的,對擴展性沒有太多要求的應用而言,刻意在應用中引入Observer模式,只會增加代碼量,對軟件的快速開發(fā)和效率提升沒有任何好處,還不如將代碼寫的簡單易懂更好。

    posted on 2006-09-30 16:40 Flyingis 閱讀(3018) 評論(1)  編輯  收藏 所屬分類: 架構與設計

    評論

    # re: The Observer Pattern [視點]  回復  更多評論   

    我們老師做桌面程序時候用到過這個!
    哎|~~今天面試時候那老板咋不問我這個呢!
    郁悶死!郁悶死啊!!!!!!!!!!!!!!
    2006-09-30 22:31 | lazyboy000
    主站蜘蛛池模板: 免费下载成人电影| 黄页免费的网站勿入免费直接进入| 日韩精品视频免费在线观看| 亚洲伊人久久大香线焦| 成人免费视频网站www| 亚洲无限乱码一二三四区| 亚洲精品视频在线免费| 亚洲欧洲精品一区二区三区| 美丽姑娘免费观看在线观看中文版| 久久精品国产精品亚洲艾草网| 性xxxxx大片免费视频| 亚洲五月六月丁香激情| 亚洲毛片免费观看| 亚洲av日韩av综合| 蜜桃精品免费久久久久影院| 亚洲国产成人久久精品软件| 国产在线ts人妖免费视频| 九九综合VA免费看| 亚洲精品无码成人片久久| 四虎影视在线影院在线观看免费视频| 亚洲国产高清视频| 成人免费在线看片| 亚洲heyzo专区无码综合| 亚洲精品WWW久久久久久 | 国产精品亚洲A∨天堂不卡| 成人免费乱码大片A毛片| 亚洲酒色1314狠狠做| 成人免费777777| 一级一级一片免费高清| 亚洲成色在线影院| 午夜神器成在线人成在线人免费| 日韩a毛片免费观看| 久久精品国产亚洲AV大全| 午夜视频在线观看免费完整版| 一级毛片完整版免费播放一区| 久久久久久亚洲精品| 免费羞羞视频网站| 成人性生交大片免费看好| 亚洲AV无码成人专区| 亚洲七七久久精品中文国产| 最近2018中文字幕免费视频|