关于消息通知的实现

539 阅读1分钟

写在前面

本文仅仅是记录做法,想了解原理的还是请查看其他文章吧!

实现

 /**
    * 需要关心的消息
    */
    public get careMessages(): string[] 
    {
        return [];
    }
    
    /**
     * 接收到消息时的处理函数
     */
    public updateData(type: string): void 
    {
        switch(type)
        {
            
        }
    }

因为ModelMessageCareComponent已经默认注册了消息观察者,在子类进行初始化的时候,会对careMessages的消息进行注册

model类里面也实现了数据通知的接口,数据改变时,手动调用updateModel进行消息通知

此时ModelMessageCareComponent就会对已注册的信息进行比对,符合的话就会触发updateData回调

举例说明:金币变更 先在ModelMessageType里面定义消息字段:

 	/**
     * 玩家金币变更
     */ 
    public static USER_GOLD_UPDATE: string = "USER_GOLD_UPDATE";

在FarmPanel里面进行消息的注册,直接放在careMessage里就行

 	/**
       * 需要关心的消息
       */
    public get careMessages(): string[] 
    {
        return [ModelMessageType.USER_GOLD_UPDATE, ModelMessageType.USER_DIAMOND_UPDATE, ModelMessageType.FARM_INFO_CHANGED];
    }
    
    /**
     * 接收到消息时的处理函数
     */
    public updateData(type: string): void 
    {
        switch(type)
        {
            case ModelMessageType.USER_GOLD_UPDATE:
                this.updateCoin();
                break;
            case ModelMessageType.USER_DIAMOND_UPDATE:
                this.updateTicket();
                break;
            case ModelMessageType.FARM_INFO_CHANGED:
                this.updateFarmLevel();
                break;
        }
    }

在LoginModel里面的金币进行修改时,调用updateModel发送ModelMessageType.USER_GOLD_UPDATE信息

 		/**
         * 玩家金币
         */
        public get gold(): number
        {
            return this._userInfo.coin;
        }

        public set gold(value: number)
        {
            if (this._userInfo == null)
            {
                return;
            }

            this._userInfo.coin = value;

            this.updateModel(ModelMessageType.USER_GOLD_UPDATE);
        }