JAVASCRIPT
Observer Pattern - Event-Driven Architecture
تنفيذ كامل لـ Observer Pattern مع دعم Event Namespacing، Once Listeners، وPriority System.
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.
استخدام حر
هذا الكود متاح للاستخدام الحر. إذا كان لديك أسئلة أو تحتاج مساعدة، لا تتردد في التواصل معي.