注册回调单例类

注册回调类

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');
相关推荐
zhensherlock3 小时前
Protocol Launcher 系列:Microsoft Edge 浏览器唤起的优雅方案
javascript·chrome·microsoft·typescript·edge·github·edge浏览器
紫_龙4 小时前
最新版vue3+TypeScript开发入门到实战教程之生命周期函数
前端·javascript·typescript
不会写DN5 小时前
从依赖到自主:手写一个 ICO 文件转换器
前端·javascript·typescript·node.js
Timer@5 小时前
TypeScript + React + GitHub Actions:我是如何打造全自动化 AI 资讯系统的 - 已开源
react.js·typescript·github
专注VB编程开发20年5 小时前
Typescript就像C#,VS IDE以前对JS只有基础、弱智能的支持
javascript·vscode·microsoft·typescript
We་ct6 小时前
LeetCode 33. 搜索旋转排序数组:O(log n)二分查找
前端·算法·leetcode·typescript·个人开发·二分·数组
书中枫叶6 小时前
个人主页网站SEO | 个人博客基于Nuxt
typescript·node.js·nuxt.js
Highcharts.js19 小时前
Highcharts React v4 迁移指南(下):分步代码示例与常见问题解决
javascript·react.js·typescript·react·highcharts·代码示例·v4迁移
求知若饥1 天前
webpage-channel 让不同页面通信像组件通信一样简便
前端·typescript·node.js
紫_龙1 天前
最新版vue3+TypeScript开发入门到实战教程之Vue3详解props
前端·vue.js·typescript