注册回调单例类
注册回调类
import { reactive } from "vue";
// 定义 Map 中的函数类型
type UpdateFunction = (value: string) => void;
class RegistryManager {
// 私有静态实例,确保全局唯一
private static instance: RegistryManager;
private registry = reactive(new Map<string, Map<string, UpdateFunction>>());
// 私有构造函数,禁止外部实例化
private constructor() {}
/**
* 获取单例实例
*/
public static getInstance(): RegistryManager {
if (!RegistryManager.instance) {
RegistryManager.instance = new RegistryManager();
}
return RegistryManager.instance;
}
/**
* 注册回调函数
* @param category 分类键
* @param key 回调键
* @param callback 回调函数
*/
register(category: string, key: string, callback: UpdateFunction): void {
if (!this.registry.has(category)) {
this.registry.set(category, reactive(new Map<string, UpdateFunction>()));
}
this.registry.get(category)?.set(key, callback);
}
/**
* 删除整个分类
* @param category 分类键
*/
removeCategory(category: string): boolean {
return this.registry.delete(category);
}
/**
* 删除分类中的特定回调
* @param category 分类键
* @param key 回调键
*/
removeCallback(category: string, key: string): boolean {
return this.registry.get(category)?.delete(key) || false;
}
/**
* 获取分类中的所有回调键
* @param category 分类键
*/
getCallbackKeys(category: string): string[] {
return Array.from(this.registry.get(category)?.keys() || []);
}
/**
* 获取特定回调函数
* @param category 分类键
* @param key 回调键
*/
getCallback(category: string, key: string): UpdateFunction | undefined {
return this.registry.get(category)?.get(key);
}
/**
* 检查分类是否存在
* @param category 分类键
*/
hasCategory(category: string): boolean {
return this.registry.has(category);
}
/**
* 检查回调是否存在
* @param category 分类键
* @param key 回调键
*/
hasCallback(category: string, key: string): boolean {
return this.registry.get(category)?.has(key) || false;
}
/**
* 执行特定回调
* @param category 分类键
* @param key 回调键
* @param value 传递给回调的值
*/
executeCallback(category: string, key: string, value: string): boolean {
const callback = this.getCallback(category, key);
if (callback) {
callback(value);
return true;
}
return false;
}
/**
* 批量执行分类中的所有回调
* @param category 分类键
* @param value 传递给回调的值
*/
executeAllCallbacks(category: string, value: string): void {
const callbacks = this.registry.get(category);
if (callbacks) {
callbacks.forEach(callback => callback(value));
}
}
/**
* 清空整个注册表
*/
clear(): void {
this.registry.clear();
}
}
// 获取全局唯一实例
export const registryManager = RegistryManager.getInstance();
功能说明
-
注册功能:
register(category, key, callback)
: 注册一个新的回调函数到指定分类
-
删除功能:
removeCategory(category)
: 删除整个分类removeCallback(category, key)
: 删除分类中的特定回调clear()
: 清空整个注册表
-
查询功能:
getCallbackKeys(category)
: 获取分类中所有回调键getCallback(category, key)
: 获取特定回调函数hasCategory(category)
: 检查分类是否存在hasCallback(category, key)
: 检查回调是否存在
-
执行功能:
executeCallback(category, key, value)
: 执行特定回调executeAllCallbacks(category, value)
: 批量执行分类中的所有回调
-
反应式特性:
- 使用 Vue 的
reactive
包装 Map,确保响应式更新
- 使用 Vue 的
使用示例
// 注册回调
registryManager.register('user', 'updateName', (value) => {
console.log(`Name updated to: ${value}`);
});
registryManager.register('user', 'updateEmail', (value) => {
console.log(`Email updated to: ${value}`);
});
// 执行单个回调
registryManager.executeCallback('user', 'updateName', 'Dirk');
// 执行所有用户回调
registryManager.executeAllCallbacks('user', '123@qq.com');
// 删除特定回调
registryManager.removeCallback('user', 'updateEmail');
// 删除整个分类
registryManager.removeCategory('user');