<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, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    [Design Pattern] The Observer Pattern

    ??? 作者:Flyingis

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

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

    ??? Observer在程序設(shè)計(jì)中使用最為廣泛是事件響應(yīng)機(jī)制。列舉《Ajax in Action》中的一段代碼:

    /* ?命名空間對(duì)象? */
    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)聽(tīng)器
    */

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


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

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

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

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

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

    評(píng)論

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

    我們老師做桌面程序時(shí)候用到過(guò)這個(gè)!
    哎|~~今天面試時(shí)候那老板咋不問(wèn)我這個(gè)呢!
    郁悶死!郁悶死啊!!!!!!!!!!!!!!
    2006-09-30 22:31 | lazyboy000
    主站蜘蛛池模板: 久久99久久成人免费播放| 久久综合亚洲色HEZYO社区| 四虎永久在线精品免费影视| 永久免费AV无码国产网站| 18禁免费无码无遮挡不卡网站 | 中文字幕亚洲情99在线| 亚洲av无码电影网| 亚洲精品一二三区| 亚洲日韩乱码中文字幕| 亚洲爆乳无码精品AAA片蜜桃| 欧美亚洲精品一区二区| 美女免费视频一区二区三区| 思思久久99热免费精品6| 亚洲免费无码在线| 最近中文字幕大全免费版在线| 久久午夜免费鲁丝片| 亚洲香蕉免费有线视频| 九九九精品成人免费视频| 免费毛片网站在线观看| 又粗又大又猛又爽免费视频| 亚洲免费日韩无码系列| 亚洲啪啪AV无码片| 久久久影院亚洲精品| 亚洲无人区视频大全| 亚洲精品美女久久7777777| 国产区图片区小说区亚洲区| 国产99久久久国产精免费| 国产一精品一AV一免费| 亚洲成人免费网址| 午夜一区二区免费视频| 亚洲人成影院在线无码观看| 久久精品亚洲一区二区| 亚洲一区二区三区免费视频| 精品久久久久久久久亚洲偷窥女厕| 国产裸体美女永久免费无遮挡| 99在线观看精品免费99| 免费看美女被靠到爽| 亚洲精品夜夜夜妓女网| 亚洲国产日韩女人aaaaaa毛片在线 | 老汉精品免费AV在线播放| 成年女人午夜毛片免费看|