学习基于 接口的消息模式

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

/// <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();
    }
}

测试:
原文地址:https://www.cnblogs.com/bambomtan/p/5011154.html