- Bridge 패턴 : 기능 계층과 구현 계층을 나눈다
Bridge 패턴은 '기능의 클래스 계층'과 '구현의 클래스 계층'이라는 두 개의 독립된 클래스 계층을 나누고, 두 계층을 연결하는 패턴이다. 계층을 분리해두면 각각의 클래스 계층을 독립적으로 확장할 수 있다.
- 어떤 경우에 사용할까?
Bridge 패턴의 특징은 '기능의 클래스 계층'과 '구현의 클래스 계층'을 분리하는 것이다. 기능을 추가하고 싶으면 기능의 클래스 계층에 클래스를 추가하면 되고, 구현의 클래스 계층은 전혀 수정할 필요가 없어진다.
- 예제 코드
다리의 어느 쪽인가? | 이름 | 설명 |
기능의 클래스 계층 | Display | '표시한다' 클래스 |
기능의 클래스 계층 | CountDisplay | '지정 횟수만큼 표시한다' 기능을 추가한 클래스 |
구현의 클래스 계층 | DisplayImpl | '표시한다' 클래스 |
구현의 클래스 계층 | StringDisplayImpl | '문자열을 사용해서 표시한다' 클래스 |
Main | 동작 테스트용 클래스 |
- Display 클래스
public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl) {
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void print() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
- CountDisplay 클래스
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
for(int i = 0 ; i < times ; i++) {
print();
}
close();
}
}
- DisplayImpl 클래스
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
- StringDisplayImpl 클래스
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.length();
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + string + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for(int i = 0 ; i < width ; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
- Main 클래스
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.display();
d2.display();
d3.multiDisplay(5);
}
}
참고문헌 : 유키 히로시 저/김성훈 역(2022), JAVA 언어로 배우는 디자인 패턴 입문, 영진닷컴
참고자료 : https://refactoring.guru/ko/design-patterns/bridge