학습일지/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 패턴이다.
장점
- 인터페이스와 실제 구현부를 서로 다른 방식으로 변경해야 할 경우
단점
- 디자인 구성이 복잡해진다
반응형