-
[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
12345678910package bridge;public interface ITV {public void on();public void off();public void switchChannel(int channel);}cs SamsungTV.java
12345678910111213141516171819package 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
12345678910111213141516171819package 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
1234567891011121314151617181920212223package 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
123456789101112131415package 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
1234567891011package bridge;public class BridgeMain {public static void main(String args[]) {ITV tv = new LGTV();LogitechRemoteControl lrc = new LogitechRemoteControl(tv);lrc.setChannelKeyboard(100);}}cs 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 인터프리터(Interpreter) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 플라이웨이트(Flyweight) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 프록시(Proxy) 패턴 (0) 2015.06.13 [Design Pattern] 어뎁터(Adapter) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 컴포지트(Composite) 패턴 - 디자인 패턴 (0) 2015.06.13