2009年12月21日 星期一

[GWT]利用 HandlerManager 實作共用的 Event Bus

原作者:tkcn

利用 HandlerManager 實作共用的 Event Bus

GWT 從版本 1.6 開始提供了新的 Event Model - Handler,並捨棄了原先的 Listener 方式。

關於 Listener 與 Handler 的差別,我推荐看這篇文章: GWT’s new Event Model – Handlers in GWT 1.6 [1]。

在這篇文章中,我將兩者與本篇文章有關的部份做介紹:


Listener:
  1. 對於每一個 Event Source 會有一個對應的 Listener,例如 MouseListener, KeyboardListener...等。
  2. 在每一個 Widget 中,針對每一種 Event Source 的 Listener,都會用一個獨立的 ListenerCollection 去紀錄。
Handler:
  1. 每一個 Event Type 都會有一個對應的 Handler,因此原先 MouseListener 相關的事件,將會被重新區分成 MouseDownHandler, MouseUpHandler...等。這樣做的一個額外的好處是,當只需要針對一種 Event Type 做處理時,實作 Handler 的類別只需要 over-ridding 一個對應的 method,而不需要像寫 Listener 時,仍然需要 over-ridding 其他沒用到的 method。
  2. 每一個 Widget 中,都只會有一個 HandlerManager,負責紀錄所有的 Event Handler。

由於 HandlerManager 能夠針對不同的 Event,dispatch 其對應的 Handler 去處理,因此我們也可以利用 HandlerManager 來做為整個 Web App 共用的 Event Bus。[2], [3]


先說明一下本篇文章欲使用的例子:
在一個 Web App 上,有許多的 Panel,我們現在希望當按下 A Panel 上的 Button 時,B Panel 上的 TextBox 會輸出文字。

在原本的做法裡,我們會讓 A panel 實作 ClickHandler,當 A panel 收到事件時,就去呼叫 B panel 所提供的方法。

這個作法會使得 A panel 必須持有 B panel 的 reference(就 UML 的角度來說就是 A 對 B 有 Aggregation 關係),這樣會使得 A, B 之間的耦合度高,造成未來擴充、修改的困難。

接下來就是解決辦法啦!

  1. 首先,於 EntryPoint 建立 HandlerManager 物件,並且將 Reference 傳給所有的 sub-component,這個部份可以利用 Constructor 達成。
    HandlerManager eventBus = new HandlerManager(null);
  2. 然後在 B panel 裡頭寫上事件處理,並且向 Event Bus 註冊。

    @Override
    protected onLoad(){
    // register event handler
    fooRegistration
    = eventBus.addHandler(FooEvent.TYPE, new FooHandler(){
    @Override
    public void onFoo(FooEvent event) {
    textBox
    .setText("A panel's button click!");
    }
    });
    }

    @Override
    protected onUnload(){
    // unregister event handler
    fooRegistration
    .removeHandler();
    }

  3. 最後是 A panel 的事件觸發,當按下按鈕時:

    eventBus
    .fireEvent(new FooEvent());


這樣一來,A 與 B 彼此可以完全不知道對方的存在,將可以大大的降低耦合度。

2009年9月27日 星期日

[閒聊] 台南一日遊

就已經知道要去古蹟風景 結果沒有人帶相機是怎樣!!

老實說這一趟行程因為卡到他們要去吃丹丹,所以變的超級不順的XDD

不過順便繞一下台南市也不錯

原本約好11點要在台南集合的,不過條臨時有事情耽誤了

大概11點半才集合完畢!

第1站:丹丹漢堡 崇德店

第2站:孔廟

第3站:國家文學館

第4站:赤崁樓 祀典武廟 大天后宮

第5站:中正路 度小月擔仔麵

第6站:億載金城

第7站:周氏蝦捲 依雷特布丁

第8站:四草大橋看夕陽

第9站:花園夜市

這次實在有點可惜,原本想說一些古蹟大家應該逛一下子就結束了

不過大家還是都逛了一圈,拍拍照片

所以,要去安平古堡跟延平老街的行程就臨時取消了。

原本還擔心說,一下子就逛完,然後有時間再去逛安平樹屋或洋行的

看來是白擔心了,呵呵。

相片貼在這邊:http://picasaweb.google.com.tw/moon80362/RisfyK#

2009年9月18日 星期五

[閒聊]白目國中生

以下是我同學的故事 將他簡稱為A


有個白目的國中生

撿到A的錢包

裡面大概1千1左右


他把錢花光之後...

想錢想瘋了 於是腦筋就動到A的證件身上


這下好了

拿A的身分證不知道幹嘛

然後就被抓包 被送到警局

據A說 刑事訴訟跑不掉了....

然後警察也很白爛

警察:你的皮夾是什麼顏色?

A:黑色!!

警察: 可是白目國中生說是藍色,你是不是記錯了...

口供硬是寫藍色...

(A很確定他的皮夾是黑色的 因為他弟跟他用同一款 然後A弟的皮夾顏色是藍色的)

為什麼不是懷疑白目國中生記錯勒??


真不知道要不要可憐那個白目國中生...

年紀輕輕就有案底了??

結論是 身分證不見真的要到警察局備案!!

然後那個國中生真他媽的腩殘沒藥醫!!

2009年8月18日 星期二

[閒聊] 第一次裝CPU...

安裝過程 都還蠻順利的

第一次裝CPU呢 顆顆

裝INTEL CPU風扇是一件很恐怖的事...

感覺一不小心,主機板就會斷掉= =

小插曲是 後來要幫他重灌的時候

發現他家的光碟機只能讀VCD....

於是又跑去買光碟機 囧

P.S. 這也是我第一次碰到SATA介面的光碟機!! XD 好多第一次

2009年8月10日 星期一

[閒聊]月光家大搜密之我家在威尼斯

好害羞...居然要讓大家看到我家附近了耶....

那我不多說了...直接看相簿吧!!!

這次是有史以來淹最高的一次...

http://picasaweb.google.com.tw/moon80362/wGaahD#

2009年8月3日 星期一

[閒聊]去麥當勞都比22K便宜??

最近跟朋友聊天剛好聊到政府的22K政策

朋友說:你看2.2w 表面還不差,實際上 每天工作8小時 還要加班到9點,

說不定去麥噹噹打工還比較爽勒

於是我打開小算盤 95*8*30 = 22800

也就是說,去麥當當打工做30天還可以多800?!

31天的話 95*8*31 = 23560 足足多了13560呢!!

當然,扣掉勞健保,麥當當可能就輸22K了

不過....據我所知,有黑心的老闆,22K還是要扣勞健保 (政府說扣掉勞健保的薪水為22K)

所以.... 有沒有政府規定時新95 結果正職薪水比打工的薪水還低的八卦阿

總之...去當家教的薪水是最多的!!!!!

[閒聊]風味堂 - ナキムシのうた (愛哭鬼之歌)


因為人是沒有眼淚就不能活下去的生物
所以不要掩飾自己的脆弱 想哭就盡情地哭吧
那些淚水將來一定會變成某人堅強的守護
所以現在為了知道痛苦 想哭就盡情地哭吧
與其忍耐著露出笑容 倒不如一切通通遺忘 哭泣也是必要
有精神了之後就來歌唱

shalalalalala...你唱著最喜歡的歌曲 臉上就綻放了笑意
shalalalalala...唱到你覺得好過些許 唱到傳達給明天的你

因為人是只能向前進的生物
所以不要陷在過去裡 想哭就盡情地哭吧
那些淚水將來一定會畫成記憶的地圖 人生也不必須要拋棄什麼
所以請趁現在盡情地哭吧


在遙遠的那方 你流下的所有淚水 都有幸福的花香
所以有元氣的話就來歌唱

shalalalalala...你唱著最喜歡的歌 臉上就綻放了笑意
shalalalalala...唱到你覺得好過些許 直到傳達給明天的你


everybody let's sing a song・・・
everybody let's sing a song for your life, for your smile
everybody let's sing a song・・・
everybody let's sing a song for your life ,for your smile for your dream ,for yourself

shalalalalala...

你唱著最喜歡的歌 臉上就綻放了笑意
shalalalalala...
唱到你覺得好過些許 直到傳達給明天的你

直到明天的你也綻放了笑意