-
[Design Pattern] 중재자(Mediator) 패턴 - 디자인 패턴CSE/Design Pattern 2015. 6. 13. 10:45
Pattern #15 중재자 패턴
관련되는 객체 사이에 레퍼런스를 피하는데 사용
패턴 요약
- 중간 행위를 찾아 별도의 클래스에 두게 함
- 다른 객체의 존재를 모르는 상태에서도 메시지를 주고 받을 수 있음
동기
당신은 자판기 제어 프로그램 개발을 주력으로 하는 회사에 취직하였다. 당신에게 주어진 일은 기존 자판기 프로그램 개발의
생산성을 저하시키는 문제점을 찾아내고, 이에 대한 해결책을 제시하는 작업이다.
문제점
- 부품 객체들이 서로 강하게 연결되어 있음.
* 각 부품 객체들이 서로 필요한 객체들을 참조하고 있다.
- 한 부품의 class가 변겨오딘다면 연관된 class들의 수정이 필요하다.
- 자판기 제어프로그램의 제어흐름이 각 부품 class마다 흩어져 있어서, 새로운 부품이 추가되었을 때 이를 위한 코드 변경이 어렵다.
해결방안
- 부품 객체들 간의 연결을 느슨하게 만들어야 한다.
- 각 부품 객체들간의 상호작용을 도맡아 처리하는 객체를 둔다.
의도
- 여러 객체들 간으 ㅣ상호작용 자체를 encapsulation하는 객체를 정의한다.
- 객체들끼리 직접 참조하는 것을 피함으로써 객체들 간의 연결 강도를 줄인다.
- 객체들과 독립적으로 상호작용을 변경할 수 있다.
적용범위
- 객체들간의 상호작용이 복잡해서 서로간의 의존관계가 구조화 되어있지 않고 이해하기 어려울 때
- 하나의 객체가 많은 다른 객체들을 참조하고 있어 이것을 재사용하기 어려울 때
- 여러 class에 분산되어 있는 행위를 많은 subclassing 없이 재구성해야 할 때
예제.
Colleague.java
12345678package mediator;public abstract class Colleague {IMediator mediator;public abstract void doSomething();}cs IMediator.java
12345678910111213package mediator;public interface IMediator {public void fight();public void talk();public void registerA(ColleagueA a);public void registerB(ColleagueB b);}cs ColleagueA.java
12345678910111213141516package mediator;public class ColleagueA extends Colleague {public ColleagueA(IMediator mediator) {this.mediator = mediator;}public void doSomething() {this.mediator.talk();this.mediator.registerA(this);}}cs ColleagueB.java
12345678910111213141516package mediator;public class ColleagueB extends Colleague {public ColleagueB(IMediator mediator) {this.mediator = mediator;this.mediator.registerB(this);}public void doSomething() {this.mediator.fight();}}cs ConcreteMediator.java
1234567891011121314151617181920212223242526package mediator;public class ConcreteMediator implements IMediator {ColleagueA talk;ColleagueB fight;public void fight() {System.out.println("Mediator is fighting");}public void talk() {System.out.println("Mediator is talking");}public void registerA(ColleagueA a) {talk = a;}public void registerB(ColleagueB b) {fight = b;}}cs MediatorMain.java
123456789101112131415package mediator;public class MediatorMain {public static void main(String[] args) {IMediator mediator = new ConcreteMediator();ColleagueA talkColleague = new ColleagueA(mediator);ColleagueB fightColleague = new ColleagueB(mediator);talkColleague.doSomething();fightColleague.doSomething();}}cs 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 커멘드(Command) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 상태(State) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 옵저버(Observer) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 인터프리터(Interpreter) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 플라이웨이트(Flyweight) 패턴 - 디자인 패턴 (0) 2015.06.13