2014年4月19日 星期六

[AS] 簡易的事件機制


因為開始製作  "樣板" !

為了區隔 "樣板內" 和 "樣板外" 的事件, 流程

讓兩種事件不能互相溝通,

甚至機制也不一樣來避免被攔截 監聽 等等等

讓 "樣板外" 的部分 不能輕易利用機制外的改變  "樣板內" 流程 !

所以我仿照 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{}



然後為了確認這個 "事件類別" 是可以正常並且如估計運行, 

所以我寫了一些的單元測試!

下一篇, 將介紹我寫了那些單元測試, 來測試這個單元

沒有留言 :