[DesignPattern] mediator pattern

2013. 12. 9. 20:26Architecture/DesignPattern

반응형

 

2013/12/03 - [Architecture/DesignPattern] - [DesignPattern] command pattern

 

2013/11/24 - [Architecture/DesignPattern] - [DesignPattern] observer pattern

 

2013/11/24 - [Architecture/DesignPattern] - [DesignPattern] Interpreter pattern

 

2013/07/21 - [Architecture/DesignPattern] - [첫번째 스터디] singleton 패턴

 

2013/07/21 - [Architecture/DesignPattern] - [첫번째 스터디] abstractFactory 패턴

 

 

<< Mediator Pattern >>

 

패턴의 의도 : 각 객체가 관련성을 갖는 다른 객체에 대한 참조관계를 직접 정의하기 보다는 이를 독립된 다른 객체가 관리..(-_-;;뭥미?)

즉, 중재한다고 보면 된다^-^

 

아래의 소스는 비행기를 예를 들었는데 너무 좋은 예인것 같다.

비행기들이 서로 충돌하지 않고 착륙 한다. 어떻게?? 관제탑이 비행기들을 중재하기 때문이다.

즉, 비행기끼리 서로 통신한다면 매우 혼란을 겪게 된다.


ex) 그림을 하나 보자

아래처럼 비행기들 끼리 서로 통신을 한다면 복잡스러울 것이다. 지금은 4대라서 6번이지만..ㅋㅋ



그래서 관제탑을 두어서 관리하면 아래와 같이 깔끔하다. 굳~!

 


Colleague : Mediator와 통신하는 객체들이라고 생각하시면 됩니다

            colleague

           미국식 [|kɑ:li:g] 발음듣기 영국식 [|kɒli:g] 발음듣기

            (같은 직장이나 직종에 종사하는) 동료

 

           핵심 문장!! : "Mediator 는 모든 것을 알고 있다+ㅁ+"

           즉,  tower.land(this);  <---Colleague에서 Mediator Pattern의 객체를 받아서 해당 method를 호출 한다.

           이미 Mediator는 task가 정해져있고 그 task를 실제로 하는 아이들이 Colleague 들이다.

     그런 의미에서 Mediator가 Colleague들을 중재한다고 볼 수 있다.


위를 이해했다면 Facade 패턴과 Mediator 패턴의 차이를 알 수가 있다.

Facade패턴은 창구라고 생각하면 되니 창구안의 객체들을 중재하는 기능은 없다.

하지만 Mediator는 이미 모든것을 정해놓고 Colleague, Mediator와 통신하는 객체들이기때문에 중재를 한다.

헷깔리지 말자~!^-^good~

 

아래의 소스에서 조금 아쉬운 것은 Colleague가 Interface 구조가 아니라는 것이다. Mediator가 하나 일 수 있지만 Colleague가 여러가지 일 경우가 많을 것이다. 물론 Mediator 또한 Interface로 갈 수 있다.(아래의 소스에 그렇게 해놨다..ㅋㅋㅋ 하지만 의미는 없다는거;;)

암튼 이해하기에는 좋은 소스임에는 틀림이 없다.


UML을 보자! - Class Diagram을 보자. 손수 그렸다..ㅋㅋ;;

또는 아래에는 표현이 되어있지는 않지만 Mediator를 Colleague에서 연관시켜서 

setMediator 로 받아서 또 다른 Mediator 사용도 가능하다.



main source

package kr.pe.acet.mediator;

public class MediatorMain {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  ControlTower tower = new ControlTower();
  
  Airplane[] airplanes = new Airplane[10]; // Colleague
  for (int i = 0; i < airplanes.length; i++) {
   airplanes[i] = new Airplane(tower, i);
  }
  for (Airplane airplane : airplanes) {
   airplane.start();
  }

 }

}
 

 

colleague source : Airplane

 package kr.pe.acet.mediator;

public class Airplane extends Thread {
    private final ControlTower tower;
    private final int seq;

    public Airplane(ControlTower tower, int seq) {
        this.tower = tower;
        this.seq = seq;
    }

    public int getSeq() {
        return seq;
    }

    @Override
    public void run() {
        try {
            while (!tower.getPermission()) {
                System.out.println(seq +"번 째 비행기 대기 중.");
                Thread.sleep(10L);
            }
            tower.land(this);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

mediator interface

 package kr.pe.acet.mediator;

public interface MediatorControlTower {
   public boolean getPermission();
   public void land(Airplane airplane) throws InterruptedException;
}

 

concreate Mediator

 package kr.pe.acet.mediator;

public class ControlTower implements MediatorControlTower{
    private volatile  boolean inUse;
   
    public synchronized boolean getPermission(){
        if (inUse) {
            return false;
        }else{
            inUse = true;
            return true;
        }
    }
   
    public void land(Airplane airplane) throws InterruptedException{
        int seq = airplane.getSeq();
        System.out.println(seq +"번 비행기 착륙 시작");
        Thread.sleep(50L);
        System.out.println(seq + "번 비행기 착륙 끝");
        inUse = false;
    }
}

 

 결과 - 쫌 길다..ㅋㅋㅋ 

1번 비행기 착륙 시작
3번 째 비행기 대기 중.
5번 째 비행기 대기 중.
0번 째 비행기 대기 중.
6번 째 비행기 대기 중.
2번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
9번 째 비행기 대기 중.
8번 째 비행기 대기 중.
3번 째 비행기 대기 중.
5번 째 비행기 대기 중.
9번 째 비행기 대기 중.
6번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
8번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
5번 째 비행기 대기 중.
3번 째 비행기 대기 중.
2번 째 비행기 대기 중.
4번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
9번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
5번 째 비행기 대기 중.
3번 째 비행기 대기 중.
7번 째 비행기 대기 중.
4번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
6번 째 비행기 대기 중.
8번 째 비행기 대기 중.
9번 째 비행기 대기 중.
5번 째 비행기 대기 중.
3번 째 비행기 대기 중.
9번 째 비행기 대기 중.
8번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
4번 째 비행기 대기 중.
1번 비행기 착륙 끝
3번 비행기 착륙 시작
5번 째 비행기 대기 중.
2번 째 비행기 대기 중.
6번 째 비행기 대기 중.
9번 째 비행기 대기 중.
8번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
4번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
4번 째 비행기 대기 중.
8번 째 비행기 대기 중.
9번 째 비행기 대기 중.
2번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
8번 째 비행기 대기 중.
9번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
9번 째 비행기 대기 중.
2번 째 비행기 대기 중.
6번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
9번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
4번 째 비행기 대기 중.
6번 째 비행기 대기 중.
8번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
3번 비행기 착륙 끝
9번 비행기 착륙 시작
6번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
8번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
0번 째 비행기 대기 중.
6번 째 비행기 대기 중.
7번 째 비행기 대기 중.
4번 째 비행기 대기 중.
8번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
8번 째 비행기 대기 중.
4번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
4번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
8번 째 비행기 대기 중.
7번 째 비행기 대기 중.
4번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
9번 비행기 착륙 끝
0번 째 비행기 대기 중.
8번 째 비행기 대기 중.
7번 째 비행기 대기 중.
6번 째 비행기 대기 중.
4번 비행기 착륙 시작
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
0번 째 비행기 대기 중.
6번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
8번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
7번 째 비행기 대기 중.
8번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
6번 째 비행기 대기 중.
4번 비행기 착륙 끝
8번 비행기 착륙 시작
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
6번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
5번 째 비행기 대기 중.
6번 째 비행기 대기 중.
2번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
8번 비행기 착륙 끝
6번 비행기 착륙 시작
2번 째 비행기 대기 중.
7번 째 비행기 대기 중.
5번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
5번 째 비행기 대기 중.
2번 째 비행기 대기 중.
7번 째 비행기 대기 중.
5번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
6번 비행기 착륙 끝
5번 비행기 착륙 시작
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
2번 째 비행기 대기 중.
0번 째 비행기 대기 중.
5번 비행기 착륙 끝
7번 째 비행기 대기 중.
2번 비행기 착륙 시작
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 째 비행기 대기 중.
2번 비행기 착륙 끝
0번 비행기 착륙 시작
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
7번 째 비행기 대기 중.
0번 비행기 착륙 끝
7번 비행기 착륙 시작
7번 비행기 착륙 끝

 



참고 사이트 : http://iilii.egloos.com/4850510 

                     http://www.youtube.com/watch?v=jWF6dvSr_Pk


- 끝 -


반응형

'Architecture > DesignPattern' 카테고리의 다른 글

[DesignPattern] state pattern  (0) 2013.12.31
[DesignPattern] memento pattern  (0) 2013.12.16
[DesignPattern] command pattern  (0) 2013.12.03
[DesignPattern] observer pattern  (0) 2013.11.24
[DesignPattern] Interpreter pattern  (0) 2013.11.24