본문 바로가기
개발/디자인 패턴

[Java 언어로 배우는 디자인 패턴 입문] 분리해서 생각하기 9. Bridge

by hongdor 2021. 1. 10.
728x90

출처 : 책 - java 언어로 배우는 디자인 패턴 입문

 

9. Bridge - 기능 계층과 구현 계층 분리하기

 

 

1. 목적

 - 기능 계층과 구현 계층을 분리

 - 장점 : 기능 인터페이스와 구현 인터페이스 나누어져 독립적으로 변경이 가능하다.

 

> 의도 : 일부분을 다른 클래스로 분리하여 기능과 구현으로 분리하고

   구현은 구현대로, 기능은 기능대로 갈아낄 수 있도록 유연성을 높인 것이다.

 

> Build 패턴의 좀더 상위 개념인거 같다.

 

 

2. 예제

 

(1) 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();
    }
}

 

 

(2) CountDisplay - 기능 클래스 상속 (구현 역할)

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();
    }
}

 

 

(3) DisplayImpl -  구현 클래스 (클래스명에 속지말자. "Impl" 이 들어갔지만 상속받는 것이 없다)

public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

 

 

(4) StringDisplayImpl - 구현 클래스 상속 (구현 역할)

public class StringDisplayImpl extends DisplayImpl {
    private String string;                              
    private int width;                                 
    public StringDisplayImpl(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++) {               
            System.out.print("-");                      
        }
        System.out.println("+");                       
    }
}

 

 

(5) 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.display();
        d3.multiDisplay(5);
    }
}
728x90

댓글