본문 바로가기
SW

GoF의 디자인 패턴(Design Patterns: Elements of Reusable Object-Oriented Software) - 5장 행동패턴 :: 중재자(Mediator)

by 라꾸스떼(YR) 2020. 5. 8.
반응형

[중재자(Mediator) - 객체 행동]

<의도>

한 집합에 속해있는 객체의 상호작용을 캡슐화하는 객체를 정의한다. 객체들이 직접 서로를 참조하지 않도록 하여 객체 사이의 소결합(loose coupling)을 촉진시킨다.

<동기>

객체지향 개발 방법론에서는 행동을 여러 객체에게 분산시켜 처리하도록 권하고 있다. 분할했다고는 하지만 시스템은 하나의 거대한 덩어리처럼 동작해야 한다. 또 시스템의 행동을 변경하는 것 역시 매우 어려워진다. 행동이 여러 객체에 걸쳐 분산되어 있기 때문에 시스템의 행동을 수정하려면 여러 클래스들을 재정의해야 할지도 모른다.

별도의 중재자 객체를 활용하면 상호작용과 관련된 행동을 하나의 객체로 모아서 이런 문제를 피해갈 수 있다. 중재자 객체는 객체 그룹 간의 상호작용을 제어하고 조화를 이루는 역할을 한다. 그룹 내 객체들에 대한 포인터를 중재자 객체가 관리하기 때문에, 객체들은 다른 객체에 대한 참조자 대신 단지 해당 중재자만 알면 된다.

<활용성>

-여러 객체가 잘 정의된 형태이기는 하지만 복잡한 상호작용을 가질 때. 객체간의 의존성이 구조화되지 않으며, 잘 이해하기 어려울 때

-한 객체가 다른 객체를 너무 많이 참조하고, 너무 많은 의사소통을 수행해서 그 객체를 재사용하기 힘들 때

-여러 클래스에 분산된 행동들이 상속 없이 상황에 맞게 수정되어야 할 때

<구조>

<참여자>

-Mediator : Colleague 객체와 교류하는 데 필요한 인터페이스를 정의한다.

-ConcreteMediator : Colleague 객체와 조화를 이뤄서 협력 행동을 구현하며, 자신이 맡을 동료(colleague)를 파악하고 관리한다.

-Colleague 클래스들 : 자신의 중재자 객체가 무엇인지 파악한다. 다른 객체와 통신이 필요하면 그 중재자를 통해 통신되도록 하는 동료 객체를 나타내는 클래스이다.

<협력 방법>

-Colleague는 Mediator에서 요청을 송수신한다. Mediator는 필요한 Colleague 사이에 요청을 전달할 의무가 있다.

<결과>

1.서브클래싱을 제한한다. 중재자는 다른 객체 사이에 분산된 객체의 행동들을 하나의 객체로 국한한다. 이 행동을 변경하고자 한다면 Mediator 클래스를 상속하는 서브클래스만 만들면 된다.

2.Colleague 객체 사이의 종속성을 줄인다.

3.객체 프로토콜을 단순화한다.

4.객체 간의 협력 방법을 추상화한다.

5.통제가 집중화된다. 중재자 객체는 동료 객체 간의 상호작용에 관련된 프로토콜을 모두 캡슐화하기 때문에 어느 동료 객체보다도 훨씬 복잡해질 수 있다.

<구현>

1.추상 클래스인 Mediator 생략. 만약 관련 객체들이 오직 하나의 Mediator 클래스와 동작한다면 Mediator를 추상 클래스로 정의할 필요가 없다. 추상 클래스의 목적은 앞으로 또 다른 상호작용을 정의할 새로운 Mediator 서브클래스를 만들 때를 대비하는 것이다.

2.동료 객체-중재자 객체 간 의사소통. Mediator 클래스를 구현하는 한 가지 방법은 감시자 패턴을 사용하는 방법이다. Colleague 객체가 주관자(subject) 객체로 동작하여 상태의 변화가 일어날 때마다 중재자에게 이를 통보하면, 중재자는 처리 방법에 따라 다른 객체들에게 변경을 통보하여 처리한다.

다른 방법은 Mediator 클래스 내에 특화된 통지(notification) 인터페이스를 정의하여 동료 객체들이 직접 통신하게 하는 것이다.

<예제 코드>

<잘 알려진 사용예>

<관련 패턴>

퍼사드 패턴은 객체들로 구성된 서브시스템을 추상화하여 좀더 편한 인터페이스를 제공하려는 것으로 중재자 패턴과는 다르다.

상호 관련된 객체들은 감시자 패턴을 이용해서 중재자 객체들과 교류한다.

반응형

댓글