학습일지/Language

[Design Pattern] Bridge

inspirit941 2020. 12. 23. 08:19
반응형

Bridge

두 가지 개념을 먼저 정리해야 한다.

  • 기능 클래스 계층. = 새로운 기능을 추가하고 싶은 경우
  • 구현 클래스 계층. = 새로운 구현을 추가하고 싶은 경우

즉, 클래스를 생성할 때 생성의도를 먼저 고민해야 한다.

  • 기능을 추가할 것인가? 구현을 추가할 것인가?
public interface IRobot {
    void powerOn();
    void powerOff();
}

public class RobotModel1 implements IRobot {
    @Override
    public void powerOn() { System.out.println("type1 : power on"); }
    @Override
    public void powerOff() { System.out.println("type1 : power off"); }
}

public class RobotModel2 implements IRobot {
    @Override
    public void powerOn() { System.out.println("type2 : power on"); }
    @Override
    public void powerOff() { System.out.println("type2 : power off"); }
}

public class TestBridgePattern {
    public static void main(String[] args){
        IRobot robot1 = new RobotModel1();
        robot1.powerOn();
        robot1.powerOff();

        IRobot robot2 = new RobotModel2();
        robot2.powerOn();
        robot2.powerOff();
    }
}

만약 여기서 IRobot 인터페이스에 doCook() 메소드가 추가되면, 이 인터페이스의 모든 구현체는 doCook() 메소드를 생성해야 한다. 심지어 당장은 doCook() 메소드가 필요하지 않은 구현체까지도.

IRobot 인터페이스와 RobotModel 객체의 코드 변경 없이 기능을 추가하고 싶은 경우.

// Adapter 패턴과 유사함.
public class IAction {
    private IRobot robot;

    public IAction(IRobot robot) { this.robot = robot; }

    // IRobot 기능을 전부 똑같이 구현
    void powerOn(){ robot.powerOn(); }
    void powerOff(){ robot.powerOff(); }

}

// 새 인터페이스를 정의할 수도 있지만, 이 경우 RobotModlel 구현체에 새 코드를 추가해야 함
// public interface IWork() {
//     void doWork();
// }

// Bridge 패턴을 적용할 클래스 Cook 생성
public class Cook extends IAction {
    public Cook(IRobot robot){ super(robot); }
    // 필요한 메소드 추가
    public void doCook() { System.out.println("do Cook"); }
}

public class TestBridgePattern {
    public static void main(String[] args){
        IRobot robot1 = new RobotModel1();
        Cook work = new Cook(work);
        work.powerOn();
        work.powerOff();

        IRobot robot2 = new RobotModel2();
        robot2.powerOn();
        robot2.powerOff();
    }
}

위 코드를 보면

  • 기능 추가: Cook 클래스 생성
  • 구현 추가: RobotModel1, RobotModel2 클래스 생성

즉, 기능부와 구현부를 분리했으나 유기적으로 사용 가능하도록 코드를 생성하는 방법. 기능부와 구현부를 연결하는 패턴이 Bridge 패턴이다.

장점

  • 인터페이스와 실제 구현부를 서로 다른 방식으로 변경해야 할 경우

단점

  • 디자인 구성이 복잡해진다
반응형