72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
|
// MessageDispatcher.ts
|
|||
|
|
|||
|
/** 消息处理器类型 */
|
|||
|
export type MessageHandler = (data: any) => void
|
|||
|
|
|||
|
export class MessageDispatcher {
|
|||
|
private static _instance: MessageDispatcher
|
|||
|
private _handlers: Map<number, MessageHandler[]> = new Map()
|
|||
|
|
|||
|
/** 单例模式 */
|
|||
|
public static get Instance(): MessageDispatcher {
|
|||
|
if (!this._instance) {
|
|||
|
this._instance = new MessageDispatcher()
|
|||
|
}
|
|||
|
return this._instance
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 注册消息处理器(允许多个 Handler)
|
|||
|
* @param msgId 消息ID
|
|||
|
* @param handler 回调函数
|
|||
|
*/
|
|||
|
public On(msgId: number, handler: MessageHandler): void {
|
|||
|
if (!this._handlers.has(msgId)) {
|
|||
|
this._handlers.set(msgId, [])
|
|||
|
}
|
|||
|
this._handlers.get(msgId)?.push(handler) // 添加到队列
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 移除指定的消息处理器(通过函数引用精准匹配)
|
|||
|
* @param msgId 消息ID
|
|||
|
* @param handler 要移除的回调函数
|
|||
|
*/
|
|||
|
public Off(msgId: number, handler: MessageHandler): void {
|
|||
|
const handlers = this._handlers.get(msgId)
|
|||
|
if (!handlers) return
|
|||
|
|
|||
|
// 过滤掉指定的 handler
|
|||
|
const newHandlers = handlers.filter((h) => h !== handler)
|
|||
|
this._handlers.set(msgId, newHandlers)
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 消息派发器中handler数量
|
|||
|
* @param msgId 消息ID
|
|||
|
* @returns 返回消息派发器中handler数量
|
|||
|
*/
|
|||
|
public Size(msgId: number): number {
|
|||
|
if (msgId === 0) {
|
|||
|
return this._handlers.size
|
|||
|
}
|
|||
|
const handlers = this._handlers.get(msgId)
|
|||
|
if (handlers) {
|
|||
|
return handlers.length
|
|||
|
}
|
|||
|
return 0
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 派发消息(按注册顺序执行所有 Handler)
|
|||
|
* @param msgId 消息ID
|
|||
|
* @param msg 消息数据
|
|||
|
*/
|
|||
|
public Dispatch(msgId: number, msg: any): void {
|
|||
|
const handlers = this._handlers.get(msgId)
|
|||
|
if (handlers) {
|
|||
|
handlers.forEach((handler) => handler(msg)) // 顺序执行
|
|||
|
}
|
|||
|
}
|
|||
|
}
|