[디자인패턴] Bridge 패턴

Bridge 패턴

상속은 견고한 연결이고 위임은 느슨한 연결이다. 필요에 따라서 클래스 간의 관계를 척척 바꾸고 싶을 때 ‘상속’이 아니라 ‘위임을’ 사용한다.

Bridge 패턴

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("+");                        // 틀의 모퉁이를 표현하는 "+"마크를 표시한다.
    }
}