-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Mediator 패턴은 객체가 서로 통신하는 방식을 캡슐화하는 행동 설계 패턴입니다. 객체 간 종속성을 줄일 수 있고, 객체 간 직접 통신을 제한하고 Mediator 객체를 통해서만 통신을 가능하게 하여 상호 작용을 독립적으로 만들도록 하는 패턴입니다. 여기에는 다음 네 가지 유형이 포함됩니다.
- colleagues는 서로 소통하고 싶어하는 대상입니다. colleague protocol을 따릅니다.
- 각각의 colleague 객체들은 mediator 객체를 참조하고 있습니다.
- 각각의 colleague 객체들은 다른 colleague와 통신을 할 때 마다 mediator와 통신합니다.
- 각각의 colleague 객체들은 다른 colleague를 인식하지 않습니다.
- colleague protocol은 각 colleague가 구현해야 하는 메서드와 프로퍼티를 정의합니다.
- mediator는 colleagues의 의사소통을 통제하는 객체입니다. mediator protocol을 따릅니다.
- 존재하는 colleague 객체들을 참조하고 생명주기를 관리합니다.
- mediator protocol은 mediator가 구현해야 하는 메서드와 프로퍼티를 정의합니다.
사용
Mediator 패턴은 객체들을 서로 독립적으로 만들기 위해 객체 간 통신을 막고 통신은 오로지 mediator 객체를 통해서 가능하도록 만들면 됩니다. 하나의 colleague 객체에서 발생한 이벤트에 대하여 다른 colleague 객체가 조치를 취하고 또 해당 객체가 다른 객체에게 영향을 미치는 추가적인 이벤트를 생성할 때 Mediator 패턴을 사용하면 좋습니다.
예를 들어 유저 프로필을 만들고 편집할 수 있는 UI가 존재한다고 해봅시다. 해당 UI는 TextField, Button 등 다양한 View들로 구성됩니다. 몇 몇 View들은 다른 View들과도 상호작용하는 경우가 발생합니다. 예를 들어 체크박스를 체크하면 관련된 TextField가 보이도록 하는 방식이 있습니다. 이 때 체크박스를 체크하면 TextField가 활성화되어야 하는데, 이러한 과정을 체크박스에 이런 기능을 넣게 되면, 해당 체크박스 컴포넌트 클래스는 다른 용도로는 사용하지 못하게 됩니다.
따라서, 이러한 객체간 통신을 mediator 객체가 수행하도록 하여 이런 문제를 해결가능합니다. 즉 체크박스에 체크를 했다는 이벤트를 mediator에 전달하고 mediator가 거기에 반응해야 하는 TextField에 이 사실을 전달하여 활성화되게 만드는 것입니다. 이렇게 하면 각각의 뷰들의 종속성이 완화되고 다양한 곳에서 재사용할 수 있게 됩니다.
주의 사항
Mediator 패턴은 colleagues를 분리하는 데 매우 유용합니다. colleagues가 서로 직접 상호작용하는 대신, 각 colleague는 mediator를 통해 소통합니다. 그러나, mediator를 시스템 내의 다른 모든 대상에 대해 알고 있는 "전역적인" 객체로 바꾸는 것에 대해 주의해야 합니다. 상호작용을 모두 mediator 객체가 수행하기 때문에 Mediator 객체가 복잡해지고 나중엔 유지하기 어려운 단일체가 될 수 있습니다. mediator가 너무 커지면 여러 mediator-colleagues 시스템으로 나누거나. 또는, 일부 기능을 위임하는 것과 같이 mediator를 분리하기 위한 다른 패턴을 생각해보아야 합니다.
정리
- Mediator 패턴은 객체가 서로 통신하는 방식을 캡슐화합니다. 여기에는 colleague, colleague 프로토콜, mediator 프로토콜, mediator 프로토콜의 네 가지 유형이 포함됩니다.
- colleague들이 직접 대화하는 대신, mediator를 통해 붙잡고 소통합니다. colleague 프로토콜과 mediator 프로토콜은 관련된 모든 물체 사이의 긴밀한 결합을 방지하는 데 도움이 됩니다.
- Single Responsibility Principle을 준수 : 다양한 객체간 통신을 하나의 객체가 수행하도록 만들어 코드를 이해하기 쉽고 유지보수도 쉬워집니다.
- Open / Closed Principle 준수: 객체들을 변경하지 않고도 새로운 Mediator를 도입할 수 있습니다.
- 개별 객체들을 더 쉽게 재사용 할 수 있습니다.