注册回调单例类

注册回调类

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');
相关推荐
ZengLiangYi9 小时前
并发 401 下的 Token 刷新竞态:一个被低估的 Bug
typescript
袋鱼不重12 小时前
Typescript 核心概念
前端·typescript
刮涂层_赢大奖13 小时前
我把 AI 编程 Agent 变成了宝可梦,让它们在像素风办公室里跑来跑去
前端·typescript·claude
时光不负努力2 天前
编程常用模式集合
前端·javascript·typescript
时光不负努力2 天前
ts+vue3开发规范
vue.js·typescript
时光不负努力2 天前
typescript常用的dom 元素类型
前端·typescript
时光不负努力2 天前
TS 常用工具类型
前端·javascript·typescript
Wect2 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
mCell2 天前
从零构建一个 Mini Claude Code:面向初学者的 Agent 开发实战指南
typescript·agent·claude
敲敲敲敲暴你脑袋3 天前
写个添加注释的vscode插件
javascript·typescript·visual studio code