zoukankan      html  css  js  c++  java
  • 学习基于 接口的消息模式

    首先 ,需要监听消息的类要继承的接口:

    /// <summary>
    /// 消息监听接口 挂载在需要监听的类上 如UI类
    /// </summary>
    public interface IEventListener 
    {
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="id">消息ID</param>
        /// <param name="param1"></param>
        /// <param name="param2"></param>
        /// <returns>是否终止消息派发</returns>
        bool HandleEvent(int id , object param1 , object param2);
    
        /// <summary>
        ///消息优先级
        /// </summary>
        /// <returns></returns>
         int EventPriority();
    
    }

    然后是消息发送者要继承的消息管理

    /*
      作者: bambom    创建时间:
      脚本: 这是一个脚本
    */
    
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class EventNote : MonoBehaviour
    {
    
        /// <summary>
        /// 节点优先级
        /// </summary>
        public int EventNodePriority { set; get; }
    
        /// <summary>
        /// 所有消息集合
        /// </summary>
        private Dictionary<int , List<IEventListener>> mListener = new Dictionary<int , List<IEventListener>>();
    
        /// <summary>
        /// 消息节点
        /// </summary>
        private List<EventNote> mNodeList = new List<EventNote>();
    
        /// <summary>
        /// 挂载一个消息节点到当前的节点上
        /// </summary>
        /// <param name="node">消息节点</param>
        /// <returns>如果节点上已经包含要添加的节点 返回false</returns>
        public bool AttachEventNode(EventNote node)
        {
            if(node==null)
            {
                return false;
            }
            if(mNodeList.Contains(node))
            {
                return false;
            }
            int pos = 0;
            for(int i=0;i<mNodeList.Count;i++)
            {
                if(node.EventNodePriority>mNodeList[i].EventNodePriority)
                {
                    break;
                }
                pos++;
            }
            mNodeList.Insert(pos , node);
            return true;
        }
    
        /// <summary>
        /// 卸载一个消息节点
        /// </summary>
        /// <param name="node">消息节点</param>
        /// <returns>如果节点不存在 就返回false</returns>
        public bool DetachEventNode(EventNote node)
        {
            if(!mNodeList.Contains(node))
            {
                return false;
            }
            mNodeList.Remove(node);
            return true;
        }
    
        /// <summary>
        /// 挂载一个消息监听器到当前消息节点
        /// </summary>
        /// <param name="key">消息ID</param>
        /// <param name="listener"> 消息监听器</param>
        /// <returns></returns>
        public bool AttachEventListener(int key , IEventListener listener)
        {
           if(listener==null)
           {
               return false;
           }
            if(!mListener.ContainsKey(key))
            {
                mListener.Add(key , new List<IEventListener>() { listener });
                return true;
            }
            if(mListener[key].Contains(listener))
            {
                return false;
            }
            int pos = 0;
            for(int i=0;i<mListener[key].Count;i++)
            {
                if(listener.EventPriority()>mListener[key][i].EventPriority())
                {
                    break;
                }
                pos++;
            }
            mListener[key].Insert(pos , listener);
            return true;
        }
    
        /// <summary>
        /// 卸载一个消息节点
        /// </summary>
        /// <param name="key"></param>
        /// <param name="listener"></param>
        /// <returns> 如果当前消息节点不存在那么返回 false</returns>
        public bool DetachEventListener(int key,IEventListener listener)
        {
            if(mListener.ContainsKey(key)&& mListener[key].Contains(listener))
            {
                mListener[key].Remove(listener);
                return true;
            }
            return false;
        }
    
        public void SendEvent(int key,object param1=null,object param2=null)
        {
            DispatchEvent(key , param1 , param2);
        }
    
        /// <summary>
        /// 派发消息到子消息节点以及自己节点下的监听器上
        /// </summary>
        /// <param name="key"><消息ID/param>
        /// <param name="param1"></param>
        /// <param name="param2"></param>
        private bool DispatchEvent(int key , object param1 , object param2)
        {
            for(int i=0;i<mNodeList.Count;i++)
            {
                if(mNodeList[i].DispatchEvent(key,param1,param2))
                return true;
            }
            return TriggerEvent(key , param1 , param2);
        }
    
        /// <summary>
        /// 消息触发
        /// </summary>
        /// <param name="key">消息id</param>
        /// <param name="param1"></param>
        /// <param name="param2"></param>
        /// <returns>是否中断</returns>
        private bool TriggerEvent(int key , object param1 , object param2)
        {
            if (!this.gameObject.activeSelf || !this.gameObject.activeInHierarchy)//还要一个判定条件||!this.gameObject.
            {
                return false;
            }
            //当前消息集合里 不含有这条消息
            if(!mListener.ContainsKey(key))
            {
                return false;
            }
            List<IEventListener> listeners=mListener[key];
            for(int i=0;i<listeners.Count;i++)
            {
                if(listeners[i].HandleEvent(key,param1,param2))
                    return this;
            }
            return false;
        }
    
        /// <summary>
        /// 
        /// </summary>
        void OnApplicationQuit()
        {
            mListener.Clear();
            mNodeList.Clear();
        }
    }

    测试:
  • 相关阅读:
    Spring HTTP Service
    Nexus搭建Maven私服
    虚拟机Class文件结构笔记
    JVM内存区域与内存溢出异常
    深入学习虚拟机类加载过程
    虚拟机常用的内存查看与分析工具
    对Java内存模型即JMM的理解
    通过Redux源码学习基础概念一:简单例子入门
    跟着官网的例子学Reacjs (一)FilterableProductTable
    es6继承 vs js原生继承(es5)
  • 原文地址:https://www.cnblogs.com/bambomtan/p/5011154.html
Copyright © 2011-2022 走看看