目录
一.编写接口
二.实现接口
三.定义消息结构
四.消息管理器MessageDispatcher的维护
五.消息类型规则
六.继承MessageHandler监听消息
七.使用
一.编写接口编写处理消息的接口类和接口方法,当消息分发后,根据消息类型处理当前消息逻辑
public interface IMessageHandler {
void HandleMessage(Messages messages);
}
二.实现接口
实现接口方法,初始化当前Handler,把当前handler注册进消息管理器,生命周期结束的时候Detach剔除
public class MessageHandler : MonoBehaviour, IMessageHandler
{
protected void Awake()
{
MessageDispatcher.Attach(this);
}
public virtual void HandleMessage(Messages messages)
{
}
protected void OnDestroy()
{
MessageDispatcher.Detach(this);
}
}
三.定义消息结构
一般我们会定义一个消息类型MesageType,主要是根据这个消息类型来分发和接收消息。另外一个就是定义消息体object,可以为任何类型的数据,当我们接收到数据后转化为我们需要的类型即可
public class Messages{
public string Type { get; private set; }
public object Data { get; private set; }
public Messages()
{
}
public Messages(string type,object data) {
this.Type = type;
this.Data = data;
}
}
四.消息管理器MessageDispatcher的维护
我们需要定义一个消息处理助手的list来存储所有可以接收消息的助手模块,
还要声明一个注册添加进这个list的函数和剥离剔除的函数
public class MessageDispatcher{
private static List messageHandlers = new List();
/// 注册消息
public static void Attach(IMessageHandler messageHandler)
{
if (messageHandlers.IndexOf(messageHandler) == -1)
{
messageHandlers.Add(messageHandler);
}
}
/// 消息事件分发
public static void Dispatch(string type,object data = null)
{
Messages msg = new Messages(type, data);
for (int i = 0; i < messageHandlers.Count; i++)
{
messageHandlers[i].HandleMessage(msg);
}
}
/// 移除注册的消息
public static void Detach(IMessageHandler handler)
{
if (messageHandlers != null)
{
messageHandlers.Remove(handler);
}
}
五.消息类型规则
消息类型的定义规则,尽可能的使名字贴近当前消息目的
public const string ShowMainView = "Show_Main_View";
public const string HideMainView = "Hide_Main_View";
public const string ShowLoginView = "Show_Login_View";
public const string HideLoginView = "Hide_Login_View";
六.继承MessageHandler监听消息
需要监听消息的对象必须继承MessageHandler,并重写HandleMessage方法
public override void HandleMessage(IMessages messages)
{
base.HandleMessage(messages);
switch(messages.Type)
{
case MessagesType.ShowErrorView:
case MessagesType.HideErrorView:
default:
break;
}
}
七.使用
MessageDispatcher.Dispatch(MessageTypes.HideErrorView);