ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 브릿지(Bridge) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:38

    Pattern #11  브릿지 패턴



     인터페이스를 실행과 분리하여 클라이언트의 요청에 따라 다르게 사용





     패턴 요약 

      - 클래스를 다른 인터페이스로 변형시키는 면에서 어뎁터 패턴과 유사하게 보임

      - 인터페이스와 실행을 분리하여 독립적으로 변할 수 있게 함



     

     동기


     

      XWindow(Unix)와 Presentation manager(OS2) 두 종류의 플랫폼을 지원하기 위하여 GUI 클래스를 그림(a)와 같이 설계하였다. 이후, Icon을 표현하기 위한 클래스인 IconWindow를 추가하려한다. 기존 클래스들과의 관계는?

       

      








    XWindow, Presentation Window 플랫폼을 모두 지원하기 위해서 IconWindow 역시 각 플랫폼에 맞는 구체 클래스가 하위 클래스로 필요하다.








     문제점

      - 새로운 플랫폼 MS-Window를 지원하려면 MSWindow클래스와 함께 MSIconWindow도 작성해야 한다.

      

     => 위 클래스 구조가 어색한 이유는 Abstraction을 위한 클래스들과 Implementation을 위한 클래스들이 하나의 Hierarchy에 섞여 있기 때문이다.









      해결방안

      - Abstraction 클래스의 Hierarchy 구조와 Implementation 클래스의 Hierarchy 구조를 분리한다













      의도

      - Abstraction 클래스의 Hierarchy 구조와 Implementation 클래스의 Hierarchy 구조를 분리한다

      - 이 두개의 Hierarchy들은 개별적으로 변화될 수 있다.




      별칭

      - Handle/Body




      적용범위

      - Abstraction 부분과 Implementation 부분을 고정하고 싶지 않을 때

      - Abstarction, Implementation 각각이 별개의 Hierarchy 구조를 가질 경우

      - Client 부분의 코드 수정 없이 실제 구현부분의 수정을 가능하게 만들 경우




      결과

      - 인터페이스와 구현의 결합을 피함

      - 개선된 확장성

      - 구현의 상세한 사실을 클라이언트에게 숨김










    예제.




    ITV.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package bridge;
     
    public interface ITV {
        public void on();
     
        public void off();
     
        public void switchChannel(int channel);
    }
     
    cs




    SamsungTV.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package bridge;
     
    public class SamsungTV implements ITV {
     
        public void on() {
            System.out.println("Samsung TV is turned on");
        }
     
        public void off() {
            System.out.println("Samsung TV is turned off");
        }
     
        public void switchChannel(int channel) {
            System.out.println("Samsung: channel - " + channel);
        }
     
    }
     
    cs




    LGTV.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package bridge;
     
    public class LGTV implements ITV {
     
        public void on() {
            System.out.println("LG TV is turned on");
        }
     
        public void off() {
            System.out.println("LG TV is turned off");
        }
     
        public void switchChannel(int channel) {
            System.out.println("LG: channel - " + channel);
        }
     
    }
     
    cs




    AbstractRemoteControl.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package bridge;
     
    public abstract class AbstractRemoteControl {
        private ITV tv;
     
        public AbstractRemoteControl(ITV tv) {
            this.tv = tv;
        }
     
        public void turnOn() {
            tv.on();
        }
     
        public void turnOff() {
            tv.off();
        }
     
        public void setChannel(int channel) {
            tv.switchChannel(channel);
        }
    }
     
    cs




    LogitechRemoteControl.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package bridge;
     
    public class LogitechRemoteControl extends AbstractRemoteControl {
     
        public LogitechRemoteControl(ITV tv) {
            super(tv);
        }
     
        public void setChannelKeyboard(int channel) {
            setChannel(channel);
            System.out.println("Logitect use keyword to set channel");
        }
    }
     
    cs





    BridgeMain.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package bridge;
     
    public class BridgeMain {
        public static void main(String args[]) {
            ITV tv = new LGTV();
            LogitechRemoteControl lrc = new LogitechRemoteControl(tv);
            lrc.setChannelKeyboard(100);
        }
    }
     
    cs














     

    댓글

Designed by Tistory.