중재자 패턴 (Mediator Pattern)

중재자 패턴 공부한 것 가볍게 정리

중재자 패턴 (Mediator Pattern)

중재자 패턴 공부한 것 가볍게 정리

작성일 : 2025.02.03

Design Pattern
  • 중재자(Mediator) 패턴은 여러 객체들이 서로 직접 통신하는 대신, 중재자 객체를 통해 통신하도록 하여 객체 간의 결합도를 낮추고, 복잡한 상호작용을 중앙 집중화하는 디자인 패턴.

  • 이벤트 집합 패턴, Pub/Sub 패턴과 비슷할 수 있지만, 이벤트 기반의 구독이 핵심이 아니고, 중재자 객체(혹은 클래스)를 통해서 작업하는 것이 큰 특징

  • 아래는 GPT를 통해 얻은 예시 코드

    // 중재자 클래스 정의
    class Mediator {
      constructor() {
        this.colleagues = [];
      }
    
      // 객체 등록
      register(colleague) {
        this.colleagues.push(colleague);
        colleague.setMediator(this);
      }
    
      // 메시지 전달: sender를 제외한 모든 동료에게 메시지 전달
      send(message, sender) {
        this.colleagues.forEach(colleague => {
          if (colleague !== sender) {
            colleague.receive(message);
          }
        });
      }
    }
    
    class Colleague {
      constructor(name) {
        this.name = name;
        this.mediator = null;
      }
    
      // 중재자 설정 메소드
      setMediator(mediator) {
        this.mediator = mediator;
      }
    
      // 메시지 전송 메소드
      send(message) {
        console.log(`${this.name}가 메시지 전송: "${message}"`);
        this.mediator.send(message, this);
      }
    
      // 메시지 수신 메소드
      receive(message) {
        console.log(`${this.name}가 메시지 수신: "${message}"`);
      }
    }
    
    // 중재자 인스턴스 생성
    const mediator = new Mediator();
    
    // 동료 인스턴스 생성
    const colleagueA = new Colleague('동료 A');
    const colleagueB = new Colleague('동료 B');
    const colleagueC = new Colleague('동료 C');
    
    // 동료들을 중재자에 등록
    mediator.register(colleagueA);
    mediator.register(colleagueB);
    mediator.register(colleagueC);
    
    // 동료 A가 메시지를 보내면 중재자가 나머지 동료들에게 메시지를 전달
    colleagueA.send('안녕하세요!');
    
  • 중재자 객체를 거쳐서 통신한다는 점에서 공부했던 책에서는 항공 교통 관제 시스템을 비교했음

  • 퍼사드 패턴과 비교했을 때 추상화가 중점이 아니라는 점에서 다른 패턴임

  • 옵저버 패턴과 비교했을 때 옵저버 패턴은 하나의 객체가 여러 이벤트를 구독하고 있는 형태라서 다름

  • Reference

    • 자바스크립트 + 리액트 디자인 패턴 스터디 (애디 오스마니 저, 윤창식 번역, 2024.8.1) pp. 166-175
copyright by dabin jeong