注册回调单例类

注册回调类

typescript 复制代码
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();

功能说明

  1. 注册功能:

    • register(category, key, callback): 注册一个新的回调函数到指定分类
  2. 删除功能:

    • removeCategory(category): 删除整个分类
    • removeCallback(category, key): 删除分类中的特定回调
    • clear(): 清空整个注册表
  3. 查询功能:

    • getCallbackKeys(category): 获取分类中所有回调键
    • getCallback(category, key): 获取特定回调函数
    • hasCategory(category): 检查分类是否存在
    • hasCallback(category, key): 检查回调是否存在
  4. 执行功能:

    • executeCallback(category, key, value): 执行特定回调
    • executeAllCallbacks(category, value): 批量执行分类中的所有回调
  5. 反应式特性:

    • 使用 Vue 的 reactive 包装 Map,确保响应式更新

使用示例

typescript 复制代码
// 注册回调
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');
相关推荐
TunerT_TQ4 小时前
GitHub深度工程评测:Cline 源码级工程评测|65k Star 开源AI编程助手的工程全景
typescript·开源·github·vs code·ai编程助手·开源供应链安全·静态源码审计
贩卖黄昏的熊1 天前
NestJS简明教程——安全
开发语言·javascript·安全·typescript·nest.js
theoweb31 天前
Typescript关于sort需要注意的地方
typescript
黄泉路醉s1 天前
在Vant+Vue+TypeScript的H移动前端使用UnoCSS
前端·vue.js·typescript
不好听6131 天前
TypeScript 类型系统:`type` vs `interface` 与 `import type`
typescript
晓说前端2 天前
TypeScript 高级特性 —— 类型断言与泛型
前端·typescript
烬羽2 天前
React 状态提升:一个 ColorPicker,彻底搞懂状态该放哪里
react.js·typescript·设计
ji_shuke3 天前
Playwright 从零到 CI 实战:基于 TypeScript 的端到端测试完整指南
javascript·ci/cd·typescript·playwright
小林ixn3 天前
React + TypeScript 实战:从“类型体操”到“数据持久化”,一次讲透组件通信与副作用管理
前端·react.js·typescript
用户0934077735143 天前
HarmonyOS WPS Open SDK 快速入门:HAR 装上就能打开文档吗
typescript·harmonyos