Ayden's journal

중재자 패턴

중재자 패턴(Mediator Pattern)은 여러 객체들이 서로 직접 통신하지 않고, 중재자를 통해 상호작용하게 하여 시스템의 결합도를 낮추고 유연성을 제공한다. 예를 들어, 카페에서 손님은 바리스타에게 직접 주문하지 않고, 캐셔라는 중재자를 통해 주문을 전달하여 바리스타가 음료를 준비하게 된다. 음료 전달은 이 반대로 캐셔를 통해 손님에게 전달된다. 이를 통해 객체 간의 결합도를 낮추고 시스템을 더 유연하게 유지할 수 있다.

 

객체의 관계를 다대다에서 일대다로 변환한다는 점에서는 옵저버 패턴과 비슷하게 느껴질 수 있다. 하지만 옵저버 패턴이 주체 객체의 상태 변화를 여러 옵저버 객체들에게 자동으로 전달하는 데 반해, 중재자 패턴은 여러 객체들이 중재자를 통해 상호작용함으로써 객체들 간의 직접적인 의존성을 없애고, 중재자가 대신 각 객체의 동작을 조정한다.

즉, 중재자는 객체들 간의 복잡한 상호작용을 중앙에서 관리하며, 각 객체가 독립적으로 동작할 수 있도록 한다. 이러한 구조는 시스템의 결합도를 낮추고, 객체들이 서로 영향을 미치지 않도록 하여, 시스템의 확장성과 유지보수성을 높여준다. 비교하자면 행위자 간의 상호 작용이 복잡하고 유지 관리 비용이 많이 드는 경우에만 중재자 모델을 사용하는 것을 고려하는 것이 좋다. 중재자 패턴은 약간의 부작용이 있으며, 때로는 크고 복잡한 중재 클래스를 생성해야 할 가능성도 있다.

// Mediator 인터페이스
interface Mediator {
  relay(sender: Colleague, message: string): void;
}

// ConcreteMediator 클래스
class ConcreteMediator implements Mediator {
  private colleagues: Colleague[] = [];

  register(colleague: Colleague): void {
    this.colleagues.push(colleague);
  }

  relay(sender: Colleague, message: string): void {
    for (const colleague of this.colleagues) {
      if (colleague !== sender) {
        colleague.receive(message);
      }
    }
  }
}

// Colleague 클래스
class Colleague {
  constructor(public name: string, public mediator: Mediator) {}

  send(message: string): void {
    console.log(`${this.name} says: ${message}`);
    this.mediator.relay(this, message);
  }

  receive(message: string): void {
    console.log(`${this.name} received: ${message}`);
  }
}

// 사용 예시
const mediator = new ConcreteMediator();

const colleague1 = new Colleague("Colleague 1", mediator);
const colleague2 = new Colleague("Colleague 2", mediator);
const colleague3 = new Colleague("Colleague 3", mediator);

mediator.register(colleague1);
mediator.register(colleague2);
mediator.register(colleague3);

colleague1.send("Hello everyone!");

 

블로그의 정보

Ayden's journal

Beard Weard Ayden

활동하기