Java/Design Pattern

[헤드퍼스트 디자인 패턴] 12-1. 브리지 패턴

noahkim_ 2024. 12. 18. 23:59

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다


1. 브리지 패턴

  • 추상 계층과 구현 계층을 독립적으로 확장할 수 있도록 다리를 두는 디자인 패턴
  • 서로 독립적으로 변경 가능한 두 계층을 분리함
  • 구현 뿐 아니라 추상화도 변경해야 하는 경우 사용

 

장점

  • 추상화와 구현을 각각 독립적으로 확장 가능
  • 조합 폭팔 방지
  • 기존 코드 변경 최소화

 

2. 예제: RemoteControl

RemoteControl (Bridge)

더보기
abstract class RemoteControl {
    protected TV tv; // Bridge to TV

    public RemoteControl(TV tv) {
        this.tv = tv;
    }

    public abstract void turnOn();
    public abstract void turnOff();
    public abstract void setChannel(int channel);
}

 

예시) BasicRemoteControl

더보기
class BasicRemoteControl extends RemoteControl {
    public BasicRemoteControl(TV tv) {
        super(tv);
    }

    @Override
    public void turnOn() {
        tv.on();
    }

    @Override
    public void turnOff() {
        tv.off();
    }

    @Override
    public void setChannel(int channel) {
        tv.changeChannel(channel);
    }
}

 

예시) SmartRemoteControl

더보기
class SmartRemoteControl extends RemoteControl {
    public SmartRemoteControl(TV tv) {
        super(tv);
    }

    @Override
    public void turnOn() {
        System.out.println("Smart Remote: Turning TV ON.");
        tv.on();
    }

    @Override
    public void turnOff() {
        System.out.println("Smart Remote: Turning TV OFF.");
        tv.off();
    }

    @Override
    public void setChannel(int channel) {
        System.out.println("Smart Remote: Setting channel via voice command.");
        tv.changeChannel(channel);
    }
}

 

TV (Implementation)

더보기
interface TV {
    void on();
    void off();
    void changeChannel(int channel);
}

 

예제) SamsungTV

더보기
class SamsungTV implements TV {
    @Override
    public void on() {
        System.out.println("Samsung TV is ON.");
    }
    @Override
    public void off() {
        System.out.println("Samsung TV is OFF.");
    }
    @Override
    public void changeChannel(int channel) {
        System.out.println("Samsung TV: Changing to channel " + channel);
    }
}

 

예제) LGTV

더보기
class LGTV implements TV {
    @Override
    public void on() {
        System.out.println("LG TV is ON.");
    }
    @Override
    public void off() {
        System.out.println("LG TV is OFF.");
    }
    @Override
    public void changeChannel(int channel) {
        System.out.println("LG TV: Changing to channel " + channel);
    }
}