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主的视频,总结写出来的,如果有侵权的地方,请联系我。