브릿지패턴
브릿지패턴은 객체의 확장성을 높히기 위한 디자인패턴입니다. 객체를 구현클래스와 추상클래스로 분리하고 추상클래스에서 확장해가는 패턴입니다. 오늘은 브릿지 패턴에 대해서 최대한 쉽게 알아보겠습니다.
예제
리모콘과 디바이스의 관계를 보겠습니다.
리모콘은 어떤 디바이스의 종류가 오든 상관없습니다. 그저 전원을 키거나 끄는 역활을 할 뿐입니다.
디바이스는 어떤 리모콘이 오든 상관없습니다. 신호가 오면 전원을 키거나 끄도록 하면 됩니다.
여기서 리모콘은 디바이스를 의존하고있어야 어떤 디바이스에 신호를 보낼 지 결정할 수 있습니다. 따라서 리모콘은 디바이스를 의존해야합니다.
리모콘이 디바이스를 의존하는 것을 bridge(다리) 로 표현한 것이 바로 브릿지패턴입니다.
Remote
public abstract class Remote {
protected final Device device;
public Remote(Device device) {
this.device = device;
}
public abstract void power();
}
public class BasicRemote extends Remote {
public BasicRemote(Device device) {
super(device);
}
@Override
public void power() {
if (device.isOn()) {
device.off();
} else {
device.on();
}
}
}
public class SmartRemote extends Remote {
public SmartRemote(Device device) {
super(device);
}
@Override
public void power() {
if (device.isOn()) {
device.off();
} else {
device.on();
}
}
public void runApp(String app) {
device.runApp(app);
}
}
Device
public interface Device {
void on();
void off();
boolean isOn();
void runApp(String app);
}
public class TV implements Device {
private boolean on = false;
@Override
public void on() {
on = true;
System.out.println("TV is on");
}
@Override
public void off() {
on = false;
System.out.println("TV is off");
}
@Override
public boolean isOn() {
return on;
}
@Override
public void runApp(String app) {
if (isOn()) {
System.out.println("TV Run App " + app);
} else {
System.out.println("TV is not On");
}
}
}
public class Radio implements Device {
private boolean on = false;
@Override
public void on() {
on = true;
System.out.println("Radio is on");
}
@Override
public void off() {
on = false;
System.out.println("Radio is off");
}
@Override
public boolean isOn() {
return on;
}
@Override
public void runApp(String app) {
}
}
public class Computer implements Device {
private boolean on = false;
@Override
public void on() {
on = true;
System.out.println("Computer is on");
}
@Override
public void off() {
on = false;
System.out.println("Computer is off");
}
@Override
public boolean isOn() {
return on;
}
@Override
public void runApp(String app) {
if (isOn()) {
System.out.println("Computer run app : " + app);
} else {
System.out.println("Computer is not On");
}
}
}
실행결과
public static void main(String[] args) {
Device radio = new Radio();
Remote basicRemote = new BasicRemote(radio);
basicRemote.power();
Device tv = new TV();
SmartRemote smartRemote = new SmartRemote(tv);
smartRemote.power();
smartRemote.runApp("YouTube");
smartRemote.power();
smartRemote.runApp("Netflix");
}
Radio is on
TV is on
TV Run App YouTube
TV is off
TV is not On
브릿지 패턴은 추상클래스와 구현클래스를 분리할 수 있어서 독립적인 확장이 가능합니다. 그리고 런타임시점에 구현체를 변경할 수 있다는 장점이 있습니다. 다만 이 브릿지패턴도 객체지향언어가 모두 그렇듯 분리하면 할수록 코드 복잡성이 증가하는 단점이 있습니다.
'디자인패턴 > 구조' 카테고리의 다른 글
자바(JAVA) - 경량 패턴(Flyweight Pattern) (0) | 2024.12.05 |
---|---|
자바(JAVA) - 복합 패턴(Composite Pattern) (0) | 2024.12.05 |
자바[JAVA] - 퍼사드 패턴(Facade Pattern) (0) | 2024.11.09 |
자바[JAVA] - 데코레이터 패턴(Decorator Pattern) (0) | 2024.10.02 |
자바(JAVA) - 어댑터 패턴(Adapter Pattern) (0) | 2024.09.24 |