본문 바로가기
Develop Story/DesignPattern

Bridge Pattern

by 박은유 2024. 3. 25.
반응형

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의 전원을 켜고 끄고 채널을 변경할 수 있습니다.

 

이처럼 TV와 리모콘을 분리하고 중간에 다리를 놓습니다.

 

장점:

  1. 구현과 추상화의 분리: Bridge 패턴은 구현과 추상화를 분리함으로써 두 가지 측면을 독립적으로 확장할 수 있게 합니다. 이는 시스템의 유연성을 높여줍니다.
  2. 클래스 계층의 감소: Bridge 패턴은 상속 대신 구성(composition)을 사용하기 때문에 클래스 계층 구조를 단순화할 수 있습니다. 이는 클래스의 수를 줄이고 유지 보수를 용이하게 만듭니다.
  3. 코드 재사용성: 구현과 추상화가 분리되어 있기 때문에 새로운 구현을 추가하거나 기존 구현을 변경해도 기존 코드를 수정할 필요가 없습니다. 이로써 코드의 재사용성이 높아집니다.

단점:

  1. 복잡성 증가: Bridge 패턴은 추가적인 클래스와 인터페이스를 도입하기 때문에 코드의 복잡성이 증가할 수 있습니다. 특히 작은 규모의 프로젝트에서는 과도한 구조화가 필요할 수 있습니다.
  2. 설계의 복잡성: Bridge 패턴은 적절한 추상화와 구현을 정의해야 하므로 초기 설계 단계에서 추가적인 고려가 필요합니다. 이를 위해 더 많은 시간과 노력이 필요할 수 있습니다.
  3. 성능 저하 가능성: 구현과 추상화를 분리함으로써 인터페이스 간의 통신이 늘어나고, 이는 성능 저하로 이어질 수 있습니다. 특히 메서드 호출이 많은 시스템에서는 이를 고려해야 합니다.
반응형

'Develop Story > DesignPattern' 카테고리의 다른 글

Memento Pattern  (0) 2024.04.15
Chain of Responsibility Pattern  (0) 2024.04.08
Visitor Pattern  (0) 2024.04.01