Design Pattern

[DesignPattern] Pub-Sub in TypeScript

다닿 2024. 3. 16. 00:46

TypeScript로 작성한 Pub-Sub 패턴

 

class EventBus {
  private subscribers: { [key: string]: Function[] } = {};

  subscribe(eventType: string, callback: Function) {
    if (!this.subscribers[eventType]) {
      this.subscribers[eventType] = [];
    }
    this.subscribers[eventType].push(callback);
  }

  publish(eventType: string, data?: any) {
    if (this.subscribers[eventType]) {
      this.subscribers[eventType].forEach(callback => {
        callback(data);
      });
    }
  }
}

// 예제를 위한 이벤트 타입 정의
const EventType = {
  USER_CREATED: 'user_created',
  MESSAGE_RECEIVED: 'message_received'
};

// 사용 예제
const eventBus = new EventBus();

// 구독자1
eventBus.subscribe(EventType.USER_CREATED, (data: { username: any; }) => {
  console.log(`User created: ${data.username}`);
});

// 구독자2
eventBus.subscribe(EventType.MESSAGE_RECEIVED, (data: { message: any; }) => {
  console.log(`구독자2 Message received: ${data.message}`);
});

// 구독자3
eventBus.subscribe(EventType.MESSAGE_RECEIVED, (data: { message: any; }) => {
  console.log(`구독자3 Message received: ${data.message}`);
});

// 이벤트 발행
eventBus.publish(EventType.USER_CREATED, { username: 'name' });
eventBus.publish(EventType.MESSAGE_RECEIVED, { message: 'message' });