Cocos Creator+TS自己写一个消息机制

cocos creator+TS自己写一个消息分发机制

防止多个类之间过多耦合,后期维护困难。

消息分发基于侦察者设计模式,在需要进行处理消息的地方进行事件监听;派发消息时,调用消息中心的派发信息接口,遍历消息的监听队列,调用对应的回调方法。

事件管理者使用单例模式,全局调用。

class EventItem{
    name:string = null;
    callback:Function = null;
    target:any = null;
}

 EventItem是一个事件item类,用来进行分发消息的实例化,里面有事件名称,回调方法,监听对象。

事件有监听,分发消息,取消监听三个函数,其他有需要的可以自行进行扩充。

    //事件管理者唯一实例
    private static _instance:EventManager = null;

    //存放事件管理者监听的事件item
    private _eventList:Map<string,Array<EventItem>> = null;
    /**事件管理者的构造函数 */
    constructor(){
        this._eventList = new Map<string,Array<EventItem>>();
    }

    /**将事件管理者设置为单例模式 
     * @returns {EventManager} 返回事件监听唯一实例
    */
    public static getInstance():EventManager{
        if(!this._instance){
            this._instance = new EventManager();
        }
        return this._instance;
    }

    /**
     * 事件管理者的事件监听
     * @param eventName 事件名称
     * @param callback 监听执行的回调
     * @param target 监听对象
     */
    public on(eventName:string,callback:Function,target:any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            array = new Array<EventItem>();
        }
        else{
            for (let i = 0; i < array.length; i++) {
                const element = array[i];
                if(element.callback === callback && element.target === target){
                    return;
                }
            }
        }
        const data = new EventItem();
        data.name = eventName;
        data.callback = callback;
        data.target = target;
        array.push(data);
        this._eventList.set(eventName,array);
        console.log(this._eventList);
    }

    /**
     * 事件管理者取消事件监听
     * @param eventName 事件名称
     * @param callback 
     * @param target 
     */
    public off(eventName:string,callback:Function,target:any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            return;
        }
        else{
            for (let i = array.length - 1; i >= 0; i--) {
                const element = array[i];
                if(element.callback === callback && element.target === target){
                    array.splice(i,1);
                }
            }
        }
    }

    /**
     * 事件管理者的发送消息
     * @param eventName 事件名称
     * @param argArray 发送数据时带的数据
     */
    public emit(eventName:string,...data: any){
        let array:any = this._eventList.get(eventName);
        if(!array){
            return;
        }
        else{
            for (let i = array.length - 1; i >= 0; i--) {
                const element = array[i];
                if(element.callback && element.target){
                    element.callback.apply(element.target,[data]);
                }
            }
        }
    }

发送消息的时候,可以带参数,如果有多个参数,我这边是放到数组中进行处理,在执行回调的时候,需要注意以下。

以上是通过查看B站某位U主的视频,总结写出来的,如果有侵权的地方,请联系我。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡西莫多说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值