AS3.0教程:強大的事件機制(6)

 事件機制寫的太多了,我自己都有點煩了。
但沒辦法,
[img]/uploads/allimg/080401/1843290.gif[/img]
,太重要了。而且AS3做了這麼多好的改進,值得我們去一一探尋,給我們日後的編程帶來極大的便利。ActionScript 初學者,本節可以跳過不看。
ActionScript 2熟練工應當看看,有些價值。
今兒講掉
4. 合成EventDispatcher進行事件發送。
5. 實現IEventDispatcher接口來進行事件發送。 與設計模式中的裝飾器模式相似。
這樣事件的發送和接受,就可以講完了。
那麼,事件部分就這樣完了?沒有!你暈,我也同暈。因爲還有一個很重要的特性,Event flow機制還沒講。這就是我所說的事件冒泡機制。給我們編程帶來了莫大的方便。
好,下面先講:
[1b]4. 合成EventDispatcher進行事件發送。[/1b]
什麼情況下用合成EventDispatcher來發送Event呢?
一般發生在某個較複雜的類裏面。
這個類可能是因爲本身已經繼承了其它類,無法再繼承EventDispatcher。
如果僅僅是因爲這個原因,那麼我更加建議[1b]使用 實現IEventDispatcher接口來進行事件發送。[/1b]
但如果原因不止如此,比如,我們不願意這個類不是一個單純事件發送類,而是在執行某個方法(method),比如doSomething()時,附帶的發送一些事件。
這些事件發送者往往是這個類的組成部分,一些更小的類,通常是Sprite等。
那麼用這種做法就比較合理。
看代碼例子
//【黑羽】ActionScript 3.0系列教程
//http://www.kingda.org
//以下爲一個名叫KingdaSampleClass的Document Class,請自行和一個Fla綁定。
//如果忘了怎麼弄,看我第三篇教程
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
public class LearnCompositeEvents extends Sprite {
public function LearnCompositeEvents() {
var kingdaObj:KingdaClass = new KingdaClass();
//一定要用kingdaObj.getSender()來返回事件發送對象,才能addEventListener
kingdaObj.getSender().addEventListener(KingdaClass.ACTION, lisFunc);
kingdaObj.doSomething();
//輸出:
//doSomething
//listened:yeahyeah 
}
//偵聽器
private function lisFunc(evtObj:Event):void {
trace ("listened:"+evtObj.type);
}
}
import flash.events.EventDispatcher;
import flash.events.Event;
class KingdaClass extends EventDispatcher {
public var _dispatcher:EventDispatcher;
public static const ACTION:String = "yeahyeah";
public function KingdaClass() {
initSender();
}
private function initSender():void {
_dispatcher = new EventDispatcher();
}
//調用一個專門的方法(method)來返回發送事件的EventDispatcher。
public function getSender():EventDispatcher {
return _dispatcher;
}
public function doSomething():void {
trace("doSomething");
//除了以下兩行發送事件,還可以寫入其它你要乾的事兒。靈活。
var evtObj:Event = new Event(KingdaClass.ACTION);
_dispatcher.dispatchEvent(evtObj);
}
}
}
 
[1b]5.實現IEventDispatcher接口來進行事件發送。[/1b]
在哪種情況下使用?
類可能是因爲本身已經繼承了其它類,無法再繼承EventDispatcher。
而我們恰恰希望它能實現EventDispatcher類所有功能,比如說addEventListener, hasListener等等,看起來簡直和繼承EventDispatcher沒什麼分別。
那麼OK,我建議使用 實現IEventDispatcher接口來進行事件發送。
[1b]其實質是一個裝飾器模式(Decorator),以對客戶端透明的方式擴展對象功能,是繼承關係的一個替代方案。其關鍵在於擴展是完全透明的,使用起來和繼承父類幾乎沒什麼區別。
[/1b]
具體方法
由於IEventDispatcher需要實現5個接口,addEventListener, hasListener, willTrigger,removeEventListener,hasEventListener,那麼我們的裝飾類也必須實現這五個接口。
其餘看代碼
優點:
1.類的用戶完全感覺不到差別
2.在被包裝的方法中還可以加入其它自己希望加進去的動作,比如,在addEventListenr方法中可以再插入一個計數,看看到底被add了多少次,超過某些次後,調用某個方法等等。
本文轉自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/1766.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章