注册回调单例类

注册回调类

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');
相关推荐
Momo__2 天前
TypeScript NoInfer<T>——精准控制泛型推断的工具类型
前端·typescript
退休倒计时3 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
kyriewen4 天前
TypeScript 高级类型:我用 infer 写了一个类型安全的 EventBus,终于搞懂了泛型约束
前端·javascript·typescript
月光刺眼4 天前
Bun + TypeScript 后端入门:从类型约束到 LLM API 调用
后端·typescript
天蓝色的鱼鱼4 天前
Node.js 现在能直接跑 TypeScript 了,tsx 和 ts-node 还需要吗?
前端·typescript·node.js
Oo9204 天前
Bun:下一代 JavaScript/TypeScript 运行时,从入门到实践
typescript·bun
Asize5 天前
Bun + TypeScript 实战:从接口约束到 RESTful 路由设计
后端·typescript·代码规范
大家的林语冰5 天前
超越 TypeScript,Flow 强势回归,语法高仿 TS,功能更丰富,类型更安全!
前端·javascript·typescript
用户484526255825 天前
Bun 入门:Bun.serve 零依赖启动 HTTP 服务
typescript
meilindehuzi_a6 天前
构建基于 RESTful 架构的 TodoList 全栈应用:从前后端理论到 TypeScript/Bun 实战
架构·typescript·restful