Event Emitter (Phát Sự Kiện)
Event Emitter là một mẫu thiết kế phổ biến được sử dụng trong phát triển phần mềm để quản lý giao tiếp giữa các thành phần hoặc đối tượng khác nhau. Về bản chất, nó cho phép một phần của hệ thống phát ra các sự kiện (emit events), và các phần khác có thể lắng nghe (listen) và phản hồi lại các sự kiện đó. Mẫu thiết kế này giảm sự phụ thuộc (decouple) giữa bên phát sự kiện và bên nhận sự kiện, giúp mã nguồn trở nên linh hoạt, mô-đun hóa và dễ mở rộng hơn.
class EventEmitter {
constructor() {
this.events = {};
}
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
}
off(event, listener) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(l => l !== listener);
}
}
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(listener => listener(...args));
}
}
}
class Player extends EventEmitter {
constructor() {
super();
this.health = 100;
this.damage = 10;
}
attack(target) {
this.emit("attack", this, target);
}
takeDamage(damage) {
this.health -= damage;
this.emit("damaged", this, damage);
if (this.health <= 0) {
this.emit("death", this);
}
}
}
const player = new Player();
player.on("attack", (attacker, target) => {
// nhân vật tấn công mục tiêu, phát âm thanh hiệu ứng
});
player.on("damaged", (player, damage) => {
// nhân vật bị nhận sát thương, hiển thị chữ sát thương và rung màn hình
});
player.on("death", (player) => {
// nhân vật bị hạ gục, hiển thị màn hình thua (lose screen)
});