기능의 클래스 계층
과 구현의 클래스 계층
사이에 다리를 놓는 패턴.
기능의 클래스 계층
: 새로운 기능을 추가하고 싶은 경우 클래스 계층안에서 자신의 목적과 가까운 클래스
를 찾아내 그 하위 클래스
를 만들어, 목적한 기능을 추가한 새로운 클래스를 만든다는 것.구현의 클래스 계층
: 새로운 구현을 만들기 위해서는 AbstractClass의 하위 클래스를 만들어 추상 메소드를 구현한 것.기능의 클래스 계층
과 구현의 클래스 계층
을 분리하는 것이다. 두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있다. 기능을 추가하고 싶으면 기능의 클래스 계층에 클래스를 추가한다. 이때 구현의 클래스 계층은 전혀 수정할 필요가 없다. 새로 추가한 기능은 ’모든구현’에서 이용할 수 있다.상속은 견고한 연결이고 위임은 느슨한 연결이다. 필요에 따라서 클래스 간의 관계를 척척 바꾸고 싶을 때 ‘상속’이 아니라 ’위임을’ 사용한다.
http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzUE0xdlV3NmR2QzQ
Bridge 패턴
http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzbk5nWTV3OXNjaTg
Bridge 패턴-예제
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.display();
d3.multiDisplay(5);
}
}
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();
}
}
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) { // times번을 반복해서 표시한다.
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
public class StringDisplayImpl extends DisplayImpl {
private String string; // 표시해야할 문자열
private int width; // 바이트 단위로 계산한 문자열의 "길이"
public StringDisplayImpl(String string) { // 생성자에서 넘어온 문자열 string를
this.string = string; // 필드에 기억해 둔다.
this.width = string.getBytes().length; // 그리고 바이트 단위의 길이도 필드에 기억해두고 나중에 사용한다.
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|"); // 앞뒤에 "|"를 붙여서 표시
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+"); // 틀의 모퉁이를 표현하는 "+"마크를 표시한다.
for (int i = 0; i < width; i++) { // width개의 "-"를 표시해서
System.out.print("-"); // 틀의 선으로 이용한다.
}
System.out.println("+"); // 틀의 모퉁이를 표현하는 "+"마크를 표시한다.
}
}