因為開始製作 "樣板" !
為了區隔 "樣板內" 和 "樣板外" 的事件, 流程
讓兩種事件不能互相溝通,
甚至機制也不一樣來避免被攔截 監聽 等等等
讓 "樣板外" 的部分 不能輕易利用機制外的改變 "樣板內" 流程 !
所以我仿照 pureMVC 的事件機制,
製作了一個簡易的事件類別 !
主要的需求是
1. 可以註冊監聽事件.
2. 可以移除單一事件
3. 可以移除全部的事件
4. 可以傳遞參數
5. 不同於 flash 基本的事件機制.
下面是 這個 事件類別 的 code
package com.tenchiwang.manager
{
public final class EventManager
{
static private var _instance:EventManager;
static public function getInstancet():EventManager
{
if(!_instance)
_instance = new EventManager(new SingletonEnforcer());
return _instance;
}
public function EventManager(sc:SingletonEnforcer){}
private var eventList:Object = new Object();
public function addListener(eventType:String, handler:Function):int
{
if(eventList[eventType] == undefined)
eventList[eventType] = new Vector.<Function>();
var vec:Vector.<Function> = eventList[eventType] as Vector.<Function>;
vec.push(handler);
return vec.length;
}
public function sendEvent(eventType:String, ...args):void
{
if(eventList[eventType] == undefined)
return;
var vec:Vector.<Function> = eventList[eventType] as Vector.<Function>;
var len:int = vec.length;
for(var i:int = 0; i < len; i++)
{
if(vec[i] != null)
vec[i].apply(this, args);
}
}
public function removeListener(eventType:String, handler:Function):void
{
if(eventList[eventType] == undefined)
return;
var vec:Vector.<Function> = eventList[eventType] as Vector.<Function>;
var len:int = vec.length;
for(var i:int = 0; i < len; i++)
{
if(vec[i] === handler)
{
vec[i] = null;
return;
}
}
}
public function removeListenerAll(eventType:String):void
{
if(eventList[eventType] == undefined)
return;
var vec:Vector.<Function> = eventList[eventType] as Vector.<Function>;
var len:int = vec.length;
for(var i:int = 0; i < len; i++)
{
vec[i] = null;
}
vec = null;
delete eventList[eventType];
}
public function clearAll():void
{
for(var key:String in eventList)
removeListenerAll(key);
}
}
}
internal class SingletonEnforcer{} 然後為了確認這個 "事件類別" 是可以正常並且如估計運行,
所以我寫了一些的單元測試!
下一篇, 將介紹我寫了那些單元測試, 來測試這個單元
沒有留言 :
張貼留言