해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



커맨드 패턴에 대한 포스트를 읽고 해당 포스트를 읽기 바란다. 

 

※ 중재자(Mediator) 패턴

: 프로그램의 상호작용을 해야하는 객체들이 서로 복잡하게 관계를 맺고 있을 경우 상호작용에 관련된 행동을 별도의 형식으로 정의하여 중재를 맡는 객체를 만드는 패턴이다.

 

ex) '갑'은 이사를 하고 싶어 집을 부동산에 내놓았다. 그러면 부동산 중개업자는 새로운 사람에게 해당 집을 대신해서 팔아준다. 그 과정에서 '갑'은 집을 사고 싶다는 사람과 어떠한 연관 관계를 갖지 않게 된다. 집을 사고 싶은 사람도 '갑'과 어떠한 관계를 맺지 않아도 된다. 이렇게 부동산 중개업자는 집을 파는 사람과 사는 사람들끼리 불편한 관계를 형성하지 않고 서로 원하는 이사라는 작업을 수행할 수 있게 해준다. 여기서 "커맨드 패턴" 포스트에 게시된 예제를 살펴보자.

 

 OpenMenuItem(String s, Frame frame){
   super(s);
   this.frame = frame;
}

public SaveMenuItem(String s, Frame frame){
   super(s);
   this.frame = frame;
}

위 코드를 보면 OpenMenuItem과 SaveMenuItem 객체는 Frame 클래스의 객체와 연관되어 있다. 이런 연관 관계는 연관된 클래스의 변화가 발생하면 관계된 다른 클래스의 변화를 가져오게 된다. 즉, 유지보수에 문제가 발생할수 밖에 없다. 또한 메뉴 아이템 클래스들은 메모장 프로젝트에서만 사용될 수 밖에 없는 이식성에 제한이 발생하게 된다. 객체지향 언어를 사용하는 이유 중 하나가 재사용성임에도 그렇게 할 수 없게 된다. 유지보수와 이식성에 문제를 일으키는 객체 간의 연관 관계 즉, 객체 간에 직접적인 메시지를 주고받음으로써 발생하는 문제를 해결하기 위해 이들 사이에 부동산 중개업자와 같은 매개체(Mediator)를 첨가해 해결할 수 있다.

 

 

public class OpenMenuItem extends MenuItem implements Command
{
   private Mediator med;

   public OpenMenuItem(Mediator med, String s){
           super(s);
           this.med = med;
           med.registOpen(this);
   }
   public void execute() {
          med.open();
   }
}

public class SaveMenuItem extends MenuItem implements Command { private Mediator med; public SaveMenuItem(Mediator med, String s){ super(s); this.med = med; med.registSave(this); } public void execute() { med.save(); } }

public class MyFrame extends Frame
{
   Mediator md;
   
   public MyFrame(Mediator med, String s){
      super(s);
      this.med = med;
      med.registerFrame(this);
   }
}
public class Mediator
{
   MenuItem open;
   MenuItem save;
   Frame frame;
   
   public void registerOpen(OpenMenuItem menu){
      open = menu;
   }
   public void registerSave(OpenMenuItem save){
     save = menu;
   }
   public void registerFrame(MyFrame frame){
      this.frame = frame;
   }
}

MenuItem 컴포넌트들이 Mediator 클래스와 관계를 갖게끔 하고 UI 컴포넌트들 사이의 메시지 송수신을 Mediator 클래스 내에서 행해진다. 관련 클래들이 Mediator 클래스 내에서만 연관 관계를 갖게 되 클래스의 변화에 따른 소스 코드 수정은 Mediator 클래스 내부에 국한되므로 수정을 최소화 할 수 있다. 하지만 Mediator 클래스에 모든 것이 집중되므로 Mediator 클래스의 구현이 복잡해지고 GOD 클래스가 될 수 있는 문제를 내포하고 있다.

 

Command 패턴과 Mediator 패턴은 이들을 결합하여 응용할 수 있고 특히 GUI를 설계할 때 아주 유용하다. 단, Mediator 클래스를 잘못 구현하면 GOD 클래스가 될 수 있으므로 주의해야 한다.

'자바 > 디자인패턴' 카테고리의 다른 글

팩토리 메서드 패턴  (0) 2017.07.04
템플릿 메서드 패턴  (0) 2017.07.04
커맨드(Command) 패턴  (0) 2017.07.03
상태(State) 패턴  (0) 2017.07.03
싱글턴(Singleton) 패턴  (0) 2017.07.03

+ Recent posts