مكتبة الأكواد
JAVASCRIPT

Observer Pattern - Event-Driven Architecture

تنفيذ كامل لـ Observer Pattern مع دعم Event Namespacing، Once Listeners، وPriority System.

JAVASCRIPT
class EventEmitter {
    constructor() {
        this.events = new Map();
        this.maxListeners = 10;
    }

    on(event, listener, priority = 0) {
        if (!this.events.has(event)) {
            this.events.set(event, []);
        }

        const listeners = this.events.get(event);
        listeners.push({ listener, priority, once: false });

        // Sort by priority (higher first)
        listeners.sort((a, b) => b.priority - a.priority);

        // Check max listeners
        if (listeners.length > this.maxListeners) {
            console.warn(`MaxListenersExceeded: ${event}`);
        }

        return this;
    }

    once(event, listener, priority = 0) {
        if (!this.events.has(event)) {
            this.events.set(event, []);
        }

        const listeners = this.events.get(event);
        listeners.push({ listener, priority, once: true });

        return this;
    }

    off(event, listenerToRemove) {
        if (!this.events.has(event)) return this;

        const listeners = this.events.get(event);
        const filtered = listeners.filter(
            ({ listener }) => listener !== listenerToRemove
        );

        this.events.set(event, filtered);
        return this;
    }

    emit(event, ...args) {
        if (!this.events.has(event)) return false;

        const listeners = this.events.get(event).slice();
        const onceListeners = [];

        listeners.forEach(({ listener, once }) => {
            try {
                listener(...args);
                if (once) {
                    onceListeners.push(listener);
                }
            } catch (error) {
                console.error(`Error in listener for ${event}:`, error);
            }
        });

        // Remove once listeners
        onceListeners.forEach(listener => this.off(event, listener));

        return true;
    }

    removeAllListeners(event) {
        if (event) {
            this.events.delete(event);
        } else {
            this.events.clear();
        }
        return this;
    }

    listenerCount(event) {
        return this.events.get(event)?.length || 0;
    }
}

// Usage
const emitter = new EventEmitter();

emitter.on('user:created', (user) => {
    console.log('Send welcome email:', user);
}, 10); // High priority

emitter.on('user:created', (user) => {
    console.log('Create user profile:', user);
}, 5);

emitter.emit('user:created', { id: 1, name: 'John' });
💡

مثال على طريقة الاستخدام

نموذج عملي يوضّح أين وكيف يمكن دمج هذا الكود داخل مشروع حقيقي.

استخدم Observer Pattern لبناء Event-Driven Systems، Decoupled Architecture، أو Plugin Systems.

استخدام حر

هذا الكود متاح للاستخدام الحر. إذا كان لديك أسئلة أو تحتاج مساعدة، لا تتردد في التواصل معي.