<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
    數(shù)據(jù)加載中……

    [Design Pattern] The Observer Pattern

    ??? 作者:Flyingis

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

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

    ??? Observer在程序設(shè)計(jì)中使用最為廣泛是事件響應(yīng)機(jī)制。列舉《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;
    }


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

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


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

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


    /*
    通知所有需要響應(yīng)事件的方法,當(dāng)事件產(chǎn)生時(shí)即調(diào)用這些方法
    */

    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);
    ??}

    }


    /*
    定義事件回調(diào)函數(shù),this指向DOM元素
    */

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

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

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

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

    posted on 2006-09-30 16:40 Flyingis 閱讀(3028) 評論(1)  編輯  收藏 所屬分類: 架構(gòu)與設(shè)計(jì)

    評論

    # re: The Observer Pattern [視點(diǎn)]  回復(fù)  更多評論   

    我們老師做桌面程序時(shí)候用到過這個(gè)!
    哎|~~今天面試時(shí)候那老板咋不問我這個(gè)呢!
    郁悶死!郁悶死啊?。。。。。。。。。。。。?!
    2006-09-30 22:31 | lazyboy000
    主站蜘蛛池模板: 美女被免费网站91色| 免费国产美女爽到喷出水来视频| 曰批全过程免费视频观看免费软件| 亚洲毛片在线观看| 国产亚洲精品成人a v小说| 女人与禽交视频免费看| 国产在线观看麻豆91精品免费| a级男女仿爱免费视频| 美女被免费视频网站| 亚洲性色AV日韩在线观看| 亚洲综合激情视频| 人人狠狠综合久久亚洲88| 亚洲色偷偷狠狠综合网| 免费国产一级特黄久久| 永久免费AV无码网站在线观看| 国产大片线上免费观看| 91成人在线免费观看| 无码av免费网站| baoyu777永久免费视频| 91成人免费福利网站在线| 一级特黄a大片免费| 日本中文字幕免费看| 在线播放国产不卡免费视频| 国产成人高清亚洲一区久久| 亚洲a∨无码精品色午夜| 亚洲一区二区三区丝袜| 日本亚洲免费无线码| 亚洲jizzjizz在线播放久| 亚洲二区在线视频| 亚洲国产成人精品激情| 亚洲日韩精品无码专区加勒比 | 免费激情网站国产高清第一页 | 1000部拍拍拍18勿入免费凤凰福利| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 亚洲欧美国产精品专区久久| 国产精品亚洲综合久久| 亚洲欧美成人综合久久久| 亚洲熟妇无码八V在线播放| 亚洲av中文无码乱人伦在线观看 | 久久WWW色情成人免费观看| 最近免费中文字幕视频高清在线看|