GoF 디자인패턴 - Bridge

Clean Code Big Poo·2025년 6월 3일
0
post-thumbnail

Overview

디자인패턴 시작하기를 보고 정리하기

Bridge

기능 계층과 구현 계층을 분리하여 시스템의 확장/유지보수성을 높이는 패턴.
기능 추가해도 기능 계층을 통해 기존 코드의 변경이 최소화됨.

  • 기능 계층 : 새로운 기능을 위한 메소드를 추가할 수 있는 클래스
  • 구현 계층 : 이미 정해진 인터페이스에 대한 구현 클래스
  • Brige : 기능 계층과 구현 계층을 연결

다이어그램

  • 기능 계층 : Draft, Publication
  • 구현 계층 : Display, SimpleDisplay, CaptionDisplay
    Draft 와 Display가 Bridge 처럼 연결된 것을 알 수 있다.

구현 코드

Display

public interface Display {
    void title(Draft draft);
    void author(Draft draft);
    void content(Draft draft);
}

SimpleDisplay


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) {
        var content = draft.getContent();
        for (String s : content) {
            System.out.println(s);
        }
    }
}

CaptionDisplay

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("내용");
        var content = draft.getContent();
        for (String s : content) {
            System.out.println("  " + s);
        }
    }
}

Draft

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 객체가 담당한다.
        display.title(this);
        display.author(this);
        display.content(this);
    }
}

Publication

/// Draft에 정보를 추가해야 하는 상황
/// Draft는 수정할 수 없음
/// => Draft 를 상속받는 Publication를 생성하여 추가 정보를 처리한다.
/// 예시) Draft에서 출판사 이름과 가격 정보가 추가됨
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);
    }

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

Main

public class MainEntry {
    public static void main(String[] args){
        var title = "복원된 지구";
        var author = "Mr. Kim";
        String[] contents = {
                "플라스틱 사용의 감소",
                "바다 생물 어획량 감소",
                "지구를 복원하자",
        };

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

        Display display1 = new SimpleDisplay();
        draft.print(display1);

        Display display2 = new CaptionDisplay();
        draft.print(display2);

        var publisher = "출판사 이름";
        var cost = 19;
        Publication publication = new Publication(title,author, contents, publisher,cost);

        publication.print(display1);// Display를 그대로 사용 가능
        publication.print(display2);
    }
}

0개의 댓글