ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 중재자(Mediator) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:45

    Pattern #15  중재자 패턴




     관련되는 객체 사이에 레퍼런스를 피하는데 사용




     패턴 요약 

      - 중간 행위를 찾아 별도의 클래스에 두게 함

      - 다른 객체의 존재를 모르는 상태에서도 메시지를 주고 받을 수 있음



     

     동기

      

      당신은 자판기 제어 프로그램 개발을 주력으로 하는 회사에 취직하였다. 당신에게 주어진 일은 기존 자판기 프로그램 개발의

    생산성을 저하시키는 문제점을 찾아내고, 이에 대한 해결책을 제시하는 작업이다.

     

     








     






    문제점

      - 부품 객체들이 서로 강하게 연결되어 있음.

       * 각 부품 객체들이 서로 필요한 객체들을 참조하고 있다.


     



     - 한 부품의 class가 변겨오딘다면 연관된 class들의 수정이 필요하다.

     - 자판기 제어프로그램의 제어흐름이 각 부품 class마다 흩어져 있어서, 새로운 부품이 추가되었을 때 이를 위한 코드 변경이 어렵다.



    해결방안

      - 부품 객체들 간의 연결을 느슨하게 만들어야 한다.

      - 각 부품 객체들간의 상호작용을 도맡아 처리하는 객체를 둔다.




     





    의도

      - 여러 객체들 간으 ㅣ상호작용 자체를 encapsulation하는 객체를 정의한다.

      - 객체들끼리 직접 참조하는 것을 피함으로써 객체들 간의 연결 강도를 줄인다.

      - 객체들과 독립적으로 상호작용을 변경할 수 있다.


    적용범위

      - 객체들간의 상호작용이 복잡해서 서로간의 의존관계가 구조화 되어있지 않고 이해하기 어려울 때

      - 하나의 객체가 많은 다른 객체들을 참조하고 있어 이것을 재사용하기 어려울 때

      - 여러 class에 분산되어 있는 행위를 많은 subclassing 없이 재구성해야 할 때















    예제.



    Colleague.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    package mediator;
     
    public abstract class Colleague {
        IMediator mediator;
     
        public abstract void doSomething();
    }
     
    cs




    IMediator.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package mediator;
     
    public interface IMediator {
        public void fight();
     
        public void talk();
     
        public void registerA(ColleagueA a);
     
        public void registerB(ColleagueB b);
    }
     
    cs

     





    ColleagueA.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    package 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

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    package 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

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    package 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

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package 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

     

















    댓글

Designed by Tistory.