컴퓨터 공학/프로그래밍 이론

[ComputerScience / 디자인 패턴] 브릿지 패턴(Bridge Pattern, 가교 패턴)

HSRyuuu 2023. 10. 1. 21:06

브리지 패턴(Bridge Pattern)


브리지 패턴은 기능 계층과 구현 계층을 분리하여 시스템의 확장성과 유지보수성을 높이는 패턴 

  • 기능 계층은 새로운 기능을 위해 메서드를 추가할 수 있는 클래스들을 말한다.
  • 구현 계층은 이미 존재하는 인터페이스에 대한 구현 클래스들을 말한다.
  • 기능은 인터페이스를 통해 정의 및 이용되고 해당 인터페이스를 따르는 클래스를 통해 구현된다.
  • 사용자는 추상부와 구현부를 독립적으로 수정 및 확장할 수 있다.
  • 객체지향 설계의 SOLID 원칙 중 단일 책임 원칙(SRP)개방 폐쇄 원칙(OCP)에 부합한 패턴이다.

기능 계층을 Book 클래스로, 구현계층의 인터페이스를 Display로 설정한 예제를 통해 알아보자.

 


 

예제


브리지 패턴은 기능 계층과 구현 계층을 분리하여 시스템의 확장성을 높일 수 있다.

예제를 통해 알아보자.

예제 흐름

기능 계층 Book이 있고, 구현 계층 Display가 있다. 

  • Book은 제목, 저자, 내용의 필드를 갖고 있는 클래스이다.
  • Display는 Book의 정보를 출력하는 기능을 하는 인터페이스이다.
  • Book.print(Display display)를 통해 Book의 정보를 출력할 수 있다.

이후에 추가로 Book에 출판사와 가격 정보를 추가해야 하는 요구사항이 발생했다.

브리지 패턴을 사용하였기 때문에 수월하게 확장이 가능할 것이다.


Book

public class Book {
    private String title;
    private String author;
    private String[] content;

    //getter, 생성자 생략

    public void print(Display display){
        display.printTitle(this);
        display.printAuthor(this);
        display.printContent(this);
    }
}

Book은 title, author, content 필드를 갖고 있고,

print 메서드에서 Display 구현체를 매개변수로 받아 Display 구현체의 로직에 따라 출력할 수 있다.

 

Display 인터페이스

public interface Display {
    void printTitle(Book book);
    void printAuthor(Book book);
    void printContent(Book book);
}

Display 인터페이스는 각각 제목, 저자, 내용을 출력할 수 있는 메서드를 갖고 있다

구현체 1 : SimpleDisplay(그냥 출력)

public class SimpleDisplay implements Display{

    @Override
    public void printTitle(Book book) {
        System.out.println(book.getTitle());
    }
    
    @Override
    public void printAuthor(Book book) {
        System.out.println(book.getAuthor());
    }
    
    @Override
    public void printContent(Book book) {
        String[] contents = book.getContent();
        for (String content : contents) {
            System.out.println(content);
        }
    }
}

구현체 2 : CaptionDisplay(설명을 추가한 출력)

public class CaptionDisplay implements Display{
    @Override
    public void printTitle(Book book) {
        System.out.println("제목: " + book.getTitle());
    }

    @Override
    public void printAuthor(Book book) {
        System.out.println("저자: " + book.getAuthor());
    }

    @Override
    public void printContent(Book book) {
        String[] contents = book.getContent();
        System.out.println("내용: ");
        for (String content : contents) {
            System.out.println(" " + content);
        }
    }
}

 


Main

public class Main {
    public static void main(String[] args) {
        Display simpleDisplay = new SimpleDisplay();
        Display captionDisplay = new CaptionDisplay();

        String title = "Java";
        String author = "제임스 고슬링";
        String[] content = {
                "자바(영어: Java)는 썬 마이크로시스템즈의 ",
                "제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 ",
                "객체 지향적 프로그래밍 언어이다."
        };
        Book book = new Book(title, author, content);
        System.out.println("=== simple ===");
        book.print(simpleDisplay);
        System.out.println("=== caption ===");
        book.print(captionDisplay);
    }
}

main에서 Book 객체를 생성 뒤, print(Display display) 메서드로 display 구현체를 선택해서 출력해 보자.

Java
제임스 고슬링
자바(영어: Java)는 썬 마이크로시스템즈의 
제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 
객체 지향적 프로그래밍 언어이다.
=== caption ===
제목: Java
저자: 제임스 고슬링
내용: 
 자바(영어: Java)는 썬 마이크로시스템즈의 
 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 
 객체 지향적 프로그래밍 언어이다.

선택한 구현체에 따라 Caption 추가 여부가 다른 것을 볼 수 있다.

 


요구사항 추가

책의 출판사, 가격을 추가로 출력해야 한다는 요구사항이 추가되었다.

 

PublicationBook

Book을 상속받은 PublicationBook 클래스를 만들고, 

publisher, cost 필드 추가 후 이 부분을 추가로 출력해 주는 메서드를 만든다.

또한 Book 클래스의 print를 재정의 한다.

public class PublicationBook extends Book {

    private String publisher;
    private int cost;

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

Book 클래스의 print 메서드를 그대로 사용하되, PublicationBook 클래스의 publisher, cost를 출력하는 부분을 추가한다.

 

Main

public class Main {
    public static void main(String[] args) {
        Display simpleDisplay = new SimpleDisplay();
        Display captionDisplay = new CaptionDisplay();

        String title = "Java";
        String author = "제임스 고슬링";
        String[] content = {
                "자바(영어: Java)는 썬 마이크로시스템즈의 ",
                "제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 ",
                "객체 지향적 프로그래밍 언어이다."
        };
        Book book = new Book(title, author, content);
        
        System.out.println("=== 요구사항 추가 ===");
        String publisher = "자바 출판사";
        Integer cost = 10000;
        
        PublicationBook publicationBook = 
        new PublicationBook(title, author, content, publisher, cost);
        
        System.out.println("=== simple ===");
        publicationBook.print(simpleDisplay);
        System.out.println("=== caption ===");
        publicationBook.print(captionDisplay);
    }
}

출력

=== 요구사항 추가 ===
=== simple ===
Java
제임스 고슬링
자바(영어: Java)는 썬 마이크로시스템즈의 
제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 
객체 지향적 프로그래밍 언어이다.
#자바 출판사 $10000
=== caption ===
제목: Java
저자: 제임스 고슬링
내용: 
 자바(영어: Java)는 썬 마이크로시스템즈의 
 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 
 객체 지향적 프로그래밍 언어이다.
#자바 출판사 $10000

 

이처럼  기존의 Book 클래스의 코드는 건드리지 않고 기능을 추가할 수 있다.

 


유튜브 GIS DEVELOPER의 Design Pattern - 6. Bridge 영상을 참고하여 작성한 글입니다.
반응형