Java/Design Pattern

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

noahkim_ 2024. 12. 18. 23:59

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


1. 브리지 패턴

  • 두 계층간의 다리를 만들어 추상 계층과 구현 계층을 분리
  • 구현과 더불어 추상화 부분까지 변경해야 할 경우 사용되는 패턴
  • 추상화 부분과 구현 부분이 독립적

 

장점
  • 추가로 인한 조합을 모두 만들지 않아도 됨
  • 변경으로 인한 기존 코드의 추가 및 수정이 적음

 

RemoteControl

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);
}
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);
    }
}
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

interface TV {
    void on();
    void off();
    void changeChannel(int channel);
}
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);
    }
}
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);
    }
}