본문 바로가기

Design Pattern/구조(Structural) 패턴

6. 브리지 패턴 (Bridge Pattern)

목차

1. 브리지 패턴 (Bridge Pattern) 이란?

2. 브리지 패턴 구조

3. 예제


브리지 패턴 (Bridge Pattern)이란?

 

기능 계층과 구현 계층의 분리로 시스템의 확장성과 유지보수성을 높이는 패턴 입니다.

 

기능 계층과 구현 계층을 연결한다는 뜻으로 브리지 패턴이라고 불립니다.

 

기존 시스템에 새로운 기능을 추가해도 기능계층을 통해 기존에 작성된 작성된 코드의 변경을 최소화

또한 기존의 기능에 대해서도 구현계층을 통해 확장을 용이하게 해줍니다.

 


브리지 패턴 구조 (Bridge Pattern Structure)

 

이름 내용
DIsplay 초안 내용을 출력을 도와줄 인터페이스
Draft 초안을 적을 클래스
Publication 추가 요청에 관련된 초안 클래스
SimpleDisplay 간단하게 출력해줄 출력 클래스
CaptionDisplay 추가 설명이 붙은 출력 클래스
Main 메인 클래스

 


예제

 

Display 인터페이스

 

 

출력에 필요한 메서드를 정의해 둡니다.

 

이떄 내용들은 Draft 에서 가져올 것이기 때문에 Draft 객체를 파라미터로 넘깁니다.

 

public interface Display {

    void title(Draft draft);
    void author(Draft draft);
    void content(Draft draft);

}

 

 

Draft 클래스

 

 

초안에 필요한 title, author, content 를 필드로 가집니다.

 

각 필드 값을 가져올 getter 를 선언합니다.

 

print 메서드를 구현하는데 이때 모든 출력은 Display 인터페이스를 이용합니다.

 

public class Draft {

    private String title;
    private String author;
    private String[] content;

    public String getTitle() {return title;}
    public String getAuthor() {return author;}
    public String[] getContent() {return content;}

    public Draft(String title, String author, String[] content){
        this.title = title;
        this.author = author;
        this.content = content;
    }

    public void print(Display display){
        display.title(this);
        display.author(this);
        display.content(this);
    }

}

 

 

SimpleDisplay 클래스

 

Display 인터페이스를 구현합니다.

public class SimpleDisplay implements Display{
    @Override
    public void title(Draft draft) {
        System.out.println(draft.getTitle());
    }

    @Override
    public void author(Draft draft) {
        System.out.println(draft.getAuthor());
    }

    @Override
    public void content(Draft draft) {
        String content = draft.getContent();
        for(var i=0;i<content.length;i++){
            System.out.println(content[i]);
        }
    }
}

 

 

CaptionDisplay 클래스

 

Display 인터페이스를 구현합니다.

public class CaptionDisplay implements Display{
    @Override
    public void title(Draft draft) {
        System.out.println("제목: " + draft.getTitle());
    }

    @Override
    public void author(Draft draft) {
        System.out.println("저자: " + draft.getAuthor());
    }

    @Override
    public void content(Draft draft) {
        System.out.println("내용: ");
        String content = draft.getContent();
        for(var i=0;i<content.length;i++){
            System.out.println("   " + content[i]);
        }
    }
}

 

 

Main 클래스

 

Draft 인스턴스를 생성하여 SimpleDisplay, CaptionDisplay 로 초안을 출력합니다.

public class Main {

    public static void main(String[] args) {

        var title = "브리지패턴";
        var author = "GOF";
        String[] content = {
                "브리지패턴은",
                "기능계층과 구현계층을 연결해주는 디자인 패턴입니다.",
                "감사합니다."
        };

        Draft draft = new Draft(title, author, content);

        Display simpleDisplay = new SimpleDisplay();
        System.out.println("SimpleDisplay");
        draft.print(simpleDisplay);

        System.out.println();

        Display captionDisplay = new CaptionDisplay();
        System.out.println("CaptionDisplay");
        draft.print(captionDisplay);

    }
}


실행 결과

SimpleDisplay
브리지패턴
GOF
브리지패턴은
기능계층과 구현계층을 연결해주는 디자인 패턴입니다.
감사합니다.

CaptionDisplay
제목: 브리지패턴
저자: GOF
내용: 
 - 브리지패턴은
 - 기능계층과 구현계층을 연결해주는 디자인 패턴입니다.
 - 감사합니다.

 


추가 요청사항

 

만약  출판사에서 원고 끝에 출판사와 가격을 넣어달라고 하면 어떻게 해야할까요?

 

브리지 패턴을 통해 구현 계층과 기능계층을 분리해두었기 때문에 구현계층만 다른 클래스로 교체해주면 간단합니다.

 

 

Publication 클래스

 

Draft 클래스를 상속받아 publisher, cost 등 필요한 필드를 추가합니다.

 

그후 print 메서드를 Override 하여 기능을 추가합니다.

 

public class Publication extends Draft{

    private String publisher;
    private int cost;

    public Publication(String title, String author, String[] content,
                       String publisher, int cost) {
        super(title, author, content);
        this.publisher = publisher;
        this.cost = cost;
    }

    private void printPublicationInfo() {
        System.out.println("#" + publisher + " $" + cost);
    }

    @Override
    public void print(Display display) {
        super.print(display);
        printPublicationInfo();
    }

}

 

 

Main 클래스

 

Publication 인스턴스를 생성하여 CaptionDisplay 로 출력해보도록 하겠습니다.

 

public class Main {

    public static void main(String[] args) {

        var title = "브리지패턴";
        var author = "GOF";
        String[] content = {
                "브리지패턴은",
                "기능계층과 구현계층을 연결해주는 디자인 패턴입니다.",
                "감사합니다."
        };

        Display captionDisplay = new CaptionDisplay();

        var publsher = "테스트 출판";
        var cost = 100;
        Publication publication = new Publication(title, author, content,
                publsher, cost);

        publication.print(captionDisplay);

    }
}

실행 결과

제목: 브리지패턴
저자: GOF
내용: 
 - 브리지패턴은
 - 기능계층과 구현계층을 연결해주는 디자인 패턴입니다.
 - 감사합니다.
#테스트 출판 $100

 

 


참조

 

https://www.youtube.com/watch?v=IJ96VeNPTyM&t=4s