디자인 패턴 ~Bridge~

1. 소개



GoF의 디자인 패턴에서 Bridge 패턴을 정리합니다.

2. Bridge 패턴이란?


  • Bridge라는 영어 단어는 다리를 의미합니다.
  • 현실 세계의 다리가, 강의 이쪽 쪽과 저쪽 쪽을 연결시키는 것처럼, Bridge 패턴도 2개의 장소를 연결하는 방식입니다.
  • Bridge 패턴이 교차하는 두 위치는 기능의 클래스 계층 구조와 구현의 클래스 계층 구조가 됩니다.

  • 기능 클래스의 계층 ... 슈퍼 클래스에서 기본적인 기능을 가지고 있고, 서브 클래스에서 새로운 기능을 추가하는 경우의 계층입니다.

  • 구현 클래스의 계층 ... 슈퍼 클래스에서 추상 메소드에 의해 인터페이스를 규정하고 있고, 서브 클래스에서 구상 메소드에 의해 그 인터페이스를 구현하는 경우의 계층입니다.

  • GoF 디자인 패턴은 구조와 관련된 디자인 패턴으로 분류됩니다.

  • 3. 샘플 클래스 다이어그램





    4. 샘플 프로그램



    입력한 문자열을 지정 횟수 및 랜덤 횟수 표시하는 프로그램입니다.

    4-1. Display 클래스



    기능의 클래스 계층 구조입니다. 「표시」를 실시하는 클래스입니다.
    이 클래스가 가지는 impl 필드가 2 개의 클래스 계층의 「다리」가 됩니다.

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

    4-2. CountDisplay 클래스



    기능의 클래스 계층 구조입니다. 「지정 횟수 표시」라고 하는 기능을 추가한 클래스입니다.

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

    4-3. RandomCountDisplay 클래스



    기능의 클래스 계층 구조입니다. 「랜덤 횟수 표시」라는 기능을 추가한 클래스입니다.

    RandomCountDisplay.java
    import java.util.Random;
    
    public class RandomCountDisplay extends CountDisplay {
    
        private Random random = new Random();
    
        public RandomCountDisplay(DisplayImpl impl) {
            super(impl);
        }
    
        public void randomDisplay(int times) {
            multiDisplay(random.nextInt(times));
        }
    }
    

    4-4. DisplayImpl 클래스



    구현의 클래스 계층이 됩니다. 「표시」용의 메소드를 정의한 클래스입니다.

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

    4-5. StringDisplayImpl 클래스



    구현의 클래스 계층이 됩니다. 「문자열을 사용해 표시하는」클래스입니다.

    StringDisplayImpl.java
    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("+");
        }
    }
    

    4-6. Main 클래스



    메인 처리를 실시하는 클래스입니다.

    Main.java
    public class Main {
    
        public static void main(String[] args) {
            Display d = new Display(new StringDisplayImpl("Display Test"));
            CountDisplay cd = new CountDisplay(new StringDisplayImpl("CountDisplay Test"));
            RandomCountDisplay rcd = new RandomCountDisplay(new StringDisplayImpl("RandomCountDisplay Test"));
            d.display();
            cd.multiDisplay(5);
            rcd.randomDisplay(10);
        }
    }
    

    4-7. 실행 결과


    +------------+
    |Display Test|
    +------------+
    +-----------------+
    |CountDisplay Test|
    |CountDisplay Test|
    |CountDisplay Test|
    |CountDisplay Test|
    |CountDisplay Test|
    +-----------------+
    +-----------------------+
    |RandomCountDisplay Test|
    |RandomCountDisplay Test|
    |RandomCountDisplay Test|
    |RandomCountDisplay Test|
    |RandomCountDisplay Test|
    |RandomCountDisplay Test|
    +-----------------------+
    

    5. 장점



    앞에서 언급했듯이 Bridge 패턴의 특징은 기능 클래스의 계층 구조와 구현 클래스의 계층 구조를 구분하는 것입니다. 이 두 클래스 계층 구조를 분리하면 각 클래스 계층 구조를 독립적으로 확장 할 수 있습니다.
    기능을 추가하려면 함수의 클래스 계층 구조에 클래스를 추가합니다. 이 때, 구현 클래스 계층은 전혀 수정할 필요는 없습니다. 게다가 추가한 기능은 모든 구현에서 이용할 수 있게 됩니다.
    샘플 프로그램에서는, CountDisplay 클래스나 RandomCountDisplay 클래스를 추가하는 것이, 기능 추가에 해당합니다.
    이와 같이 Bridge 패턴에서는 클래스의 확장을 전망하고 잘 할 수 있습니다.

    6. GitHub


  • htps : // 기주 b. 코 m / 이타나카 730 /

  • 7. 디자인 패턴 목록


  • GoF 디자인 패턴 요약

  • 8. 참고



    이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
  • Java 언어로 배우는 디자인 패턴 입문

  • 매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
    디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.

    좋은 웹페이지 즐겨찾기