반응형
Bridge Pattern이란?
: 추상화와 구현을 분리하여 각각 독립적으로 확장할 수 있게 하는 디자인 패턴입니다. '기능의 클래스 계층'과 '구현의 클래스 계층'을 나누고 중간을 연결하는 다리(Bridge)를 놓습니다. 이렇게 두 개의 독립된 클래스 계층으로 나누면 각각의 클래스 계층을 독립적으로 확장할 수 있습니다.
예시 :
다음 예제는 Bridge 패턴을 사용하여 TV와 리모컨 사이의 관계를 구현했습니다. TV를 추상화하고(TV 인터페이스), 리모컨을 구현(Remote 인터페이스)으로 나타내어 각각 독립적으로 확장할 수 있습니다. 이를 통해 SamsungTV와 SonyTV를 구체적인 구현으로 만들어 BasicRemote 클래스를 이용하여 TV의 전원을 켜고 끄고 채널을 변경할 수 있습니다.
// Implementor interface
interface TV {
void on();
void off();
void tuneChannel(int channel);
}
// Concrete Implementor 1
class SamsungTV implements TV {
public void on() {
System.out.println("Samsung TV is ON");
}
public void off() {
System.out.println("Samsung TV is OFF");
}
public void tuneChannel(int channel) {
System.out.println("Samsung TV tuned to channel " + channel);
}
}
// Concrete Implementor 2
class SonyTV implements TV {
public void on() {
System.out.println("Sony TV is ON");
}
public void off() {
System.out.println("Sony TV is OFF");
}
public void tuneChannel(int channel) {
System.out.println("Sony TV tuned to channel " + channel);
}
}
// Abstraction interface
interface Remote {
void powerOn();
void powerOff();
void setChannel(int channel);
}
// Refined Abstraction
class BasicRemote implements Remote {
protected TV tv;
public BasicRemote(TV tv) {
this.tv = tv;
}
public void powerOn() {
tv.on();
}
public void powerOff() {
tv.off();
}
public void setChannel(int channel) {
tv.tuneChannel(channel);
}
}
// Client
public class Main {
public static void main(String[] args) {
TV samsungTV = new SamsungTV();
TV sonyTV = new SonyTV();
Remote remote1 = new BasicRemote(samsungTV);
Remote remote2 = new BasicRemote(sonyTV);
remote1.powerOn();
remote1.setChannel(5);
remote1.powerOff();
remote2.powerOn();
remote2.setChannel(10);
remote2.powerOff();
}
}
기능 클래스(Remote)와 구현 클래스(TV)를 나누어 구현했습니다. Remote는 추상화를 나타내며, TV는 구현을 나타냅니다. 이를 통해 BasicRemote 클래스를 사용하여 TV의 전원을 켜고 끄고 채널을 변경할 수 있습니다.
장점:
- 구현과 추상화의 분리: Bridge 패턴은 구현과 추상화를 분리함으로써 두 가지 측면을 독립적으로 확장할 수 있게 합니다. 이는 시스템의 유연성을 높여줍니다.
- 클래스 계층의 감소: Bridge 패턴은 상속 대신 구성(composition)을 사용하기 때문에 클래스 계층 구조를 단순화할 수 있습니다. 이는 클래스의 수를 줄이고 유지 보수를 용이하게 만듭니다.
- 코드 재사용성: 구현과 추상화가 분리되어 있기 때문에 새로운 구현을 추가하거나 기존 구현을 변경해도 기존 코드를 수정할 필요가 없습니다. 이로써 코드의 재사용성이 높아집니다.
단점:
- 복잡성 증가: Bridge 패턴은 추가적인 클래스와 인터페이스를 도입하기 때문에 코드의 복잡성이 증가할 수 있습니다. 특히 작은 규모의 프로젝트에서는 과도한 구조화가 필요할 수 있습니다.
- 설계의 복잡성: Bridge 패턴은 적절한 추상화와 구현을 정의해야 하므로 초기 설계 단계에서 추가적인 고려가 필요합니다. 이를 위해 더 많은 시간과 노력이 필요할 수 있습니다.
- 성능 저하 가능성: 구현과 추상화를 분리함으로써 인터페이스 간의 통신이 늘어나고, 이는 성능 저하로 이어질 수 있습니다. 특히 메서드 호출이 많은 시스템에서는 이를 고려해야 합니다.
반응형
'Develop Story > DesignPattern' 카테고리의 다른 글
Memento Pattern (0) | 2024.04.15 |
---|---|
Chain of Responsibility Pattern (0) | 2024.04.08 |
Visitor Pattern (0) | 2024.04.01 |