Java/디자인 패턴

[디자인 패턴] 브릿지 패턴

태감새 2023. 4. 24. 11:21

코딩으로 학습하는 GoF의 디자인 패턴

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

브릿지

추상적인 것과 구체적인 것을 분리하여 연결하는 패턴

  • 하나의 계층 구조일 때 보다 나누었을 때 독립적인 계층 구조로 발전 시킬 수 있다.

Client는 Abstraction을 반환타입으로 사용

예제

  • 실질적으로 DefaultBook이 Genre를 필드로 받고있음.

 

Genre (Implementation)

  • 간단한 장르 인터페이스
public interface Genre {  
   String getGenre();  
}

Novel

public class Novel implements Genre{  
   @Override  
   public String getGenre() {  
      return "Novel";  
   }  
}

Essay

public class Essay implements Genre{  
   @Override  
   public String getGenre() {  
      return "Essay";  
   }  
}

 

Book (Abstraction)

  • Book 인터페이스
public interface Book {  
   void bookInfo();  
}

DefaultBook

  • Book의 기본적인 구현체
    • Genre를 필드로 받음
    • bookInfo()를 구현
public class DefaultBook implements Book{  

   private Genre genre;  
   private String title;  
   private String author;  

   public DefaultBook(Genre genre, String title, String author) {  
      this.genre = genre;  
      this.title = title;  
      this.author = author;  
   }  

   @Override  
   public void bookInfo() {  
      System.out.printf("title : %s, author : %s, genre : %s\n", title, author, genre.getGenre());  
   }  
}

Stoner

public class Stoner extends DefaultBook {  
   public Stoner(Genre genre) {  
      super(genre, "STONER", "John Williams");  
   }  
}

 

App

  • 책에대한 구현체와 장르에 대한 구현체를 달리 만들어서 하나의 Book을 생성하였다.
public class App {  
   public static void main(String[] args) {  
      Book book = new Stoner(new Novel());  
      book.bookInfo();  
      // title : STONER, author : John Williams, genre : Novel
   }  
}

 

장/단점

장점

  • 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
    • Book코드에 Genre 인터페이스를 추가한 것처럼 확장 필요시 이어 붙이면 된다.
    • 반대로 삭제하고 싶으면 해당인터페이스를 지우면 되므로 변경에 자유롭다.
  • 추상적인 코드와 구체적인 코드를 분리할 수 있다.
    • Book과 Genre 분리

단점

  • 계층 구조가 늘어나 복잡도가 증가할 수 있다.

 

개인적인 생각

Adapter vs Bridge

공통점

연관없는 클래스들을 연결한다.

차이점

  • Adapter
    • 두 가지의 연관없는 클래스를 연결시켜주는 패턴 (1:1)
    • 호환성을 위해 반환타입 변형 용도로 사용
  • Bridge
    • 하나의 클래스에서 다리를 놓아서 확장하는 패턴 (1:N)
    • 중심 클래스의 기능 확장 용도로 사용