중재자 패턴 (Mediator Pattern) 이란?
- 여러 객체 간의 의사소통하는 방법을 추상화한다.
- 객체간의 혼란스러운 종속성을 줄일 수 있는 디자인 패턴이다.
- 객체간 직접적인 통신을 제한하고 중개자 객체(Mediator Object)를 통해서만 협업하도록 한다.
실생활 예제
- 아파트의 관리사무소는 주민들간의 갈등을 중간에서 해결해준다.
- 비행기 이착륙을 돕는 관제탑
다이어그램으로 살펴보기
- 아래의 형태만 중재자 패턴인 게 아니라, 아래의 형태가 대표적인 중재자 패턴인 것이다.
- 즉, 다른 다이어그램으로 그려져도 중재자 패턴을 사용한 것일 수 있다.
- 여러 컴포넌트간 결합도를 중재자를 통해 낮춘다.
Colleague
가Colleague
를 직접 참조하는 선이 없다는 것이 중요하다.Mediator
를 참조하고,ConcreteMediator
가 각ColleagueA
,ColleagueB
를 참조한다.
- 의존성을 중재자인
Mediator
로 몰아 놓는다.
코드 예제
- 돈과 관련된 메서드를
Person
에서 처리하다가BankAccount
라는 중재자를 만들어 처리하는 예제이다. - 돈과 관련된 의존성을 모두 은행 계좌 (
BankAccount
) 로 몰아넣는다.Company
와Person
은 모두BankAccountOwner
를 구현한 구현체로 계좌의 주인이 될 수 있다.
public static void beforeBankAccount() {
Person jake = new Person("jake", 100_000);
Person jack = new Person("jack", 10);
Company apple = new Company("apple", 100_000);
MoneyBox moneyBox = new MoneyBox();
// jack 에게 돈 보내기
jake.sendMoney(jack, 1000);
jake.checkCash();
// 회사에 투자하기
jake.investMoney(apple, 1000);
jake.checkCash();
// 저금통에 돈 넣기
jake.saveMoney(moneyBox, 1000);
jake.checkCash();
}
public static void afterBankAccount() {
Person jake = new Person("jake", 100_000);
BankAccount jakeBankAccount = new BankAccount(jake);
jakeBankAccount.saveMoney(3000);
Person jack = new Person("jack", 5000);
BankAccount jackBankAccount = new BankAccount(jack);
jackBankAccount.saveMoney(3000);
Company apple = new Company("apple", 100_000);
BankAccount appleBankAccount = new BankAccount(apple);
// 돈 보내기
jakeBankAccount.sendMoney(jackBankAccount, 1000);
// 회사에 투자하기
jakeBankAccount.sendMoney(appleBankAccount, 1000);
}
장점과 단점
장점
- 관심사별로 중재자를 두어 이해가 쉬운 코드로 변환할 수 있다.
Person
객체나Company
객체는 각각 본래의 목적에 치중하는 코드만 깔끔하게 둘 수 있다.- 돈에 관련된 코드는
BankAccount
에 몰려있기 때문에 코드가 훨씬 깔끔해진다.
- 실생활에서 연예인의 매니저는 연예인 본업 외에 잡무를 처리해준다.
단점
- 한번 중재자를 이용하기 시작하면 중재자를 아예 없애는 변화를 주는 것이 매우 어려워진다.
- 한 곳으로 의존성이 이미 모두 몰려버린다는 단점이 있다.
중재자 패턴이 적용된 자바 코드와 스프링 코드 예제
자바의 ExecutorService
혹은 Executor
ExecutorService
,Executor
Runnable
이나Future
에서 하는 일을 다른 컴포넌트에 위임하는 것을 중재자 패턴의 일종이라고 볼 수 있음
스프링 MVC 의 DispatcherServlet
DispatcherServlet
자체를 일종의 중재자로 볼 수 있다.- 내부에 있는
Resolver
들은 각각의 연결 관계가 없음.DispatcherServlet
만Resolver
들을 알고 있다.DispatcherServlet
은 요청을 중재하여 알맞은Resolver
나Adapter
와 같은 컴포넌트에 넘겨준다.- 애노테이션 기반으로 이 동작을 수행하는 경우가 많다.
ViewResolver
는Handler
에서 반환하는 문자열 등에 따라 동작한다.
레퍼런스
반응형
'Java > 자바 디자인 패턴' 카테고리의 다른 글
이터레이터 패턴 (Iterator Pattern) 이란? (0) | 2023.04.30 |
---|---|
인터프리터 패턴 (Interpreter Pattern) 이란? (0) | 2023.04.30 |
커맨드 패턴 (Command Pattern) 이란? (0) | 2023.04.28 |
책임 연쇄 패턴 (Chain Of Responsibility) 이란? (2) | 2023.04.26 |
프록시 패턴 (Proxy Pattern) 이란? (0) | 2023.04.25 |