[ComputerScience / 디자인 패턴] 브릿지 패턴(Bridge Pattern, 가교 패턴)
브리지 패턴(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 영상을 참고하여 작성한 글입니다.