2009年12月21日 星期一

[道歉]關於下面那一篇文章

由於本人疏忽

忘記在文章上面附上原作者ID

特此向原作者 tkcn 道歉

[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 結果正職薪水比打工的薪水還低的八卦阿

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