본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Bridge 패턴

기능부와 구현부를 나눈 후 그 사이를 연결하는 패턴

기능부 : 새로운 기능을 확장해가는 부분 (ex. 사칙연산 기능에 제곱을 구해주는 기능을 추가한 클래스)

구현부 : 추상클래스를 실제로 구현한 부분 (ex. 사칙연산 기능을 가진 추상 클래스를 실제 구현한 클래스)


 

1. 코드

Display : 기능부의 최상위 클래스(한번 출력하는 기능), impl이 브릿지 역할

public class Display {
	private DisplayImpl impl;
	
	public Display(DisplayImpl impl) {
		this.impl = impl;
	}
	
	public void start() {
		impl.start();
	}
	
	public void print() {
		impl.print();
	}
	
	public void finish() {
		impl.finish();
	}
	
	public void myPrint() {
		start();
		print();
		finish();
	}
}

 

DisplayImpl : 구현부의 최상의 클래스

public abstract class DisplayImpl {
	public abstract void start();
	public abstract void print();
	public abstract void finish();
}

 

MultiDisplay: 기능부에 추가한 클래스(여러번 출력하는 기능)

public class MultiDisplay extends Display {

	public MultiDisplay(DisplayImpl impl) {
		super(impl);
	}
	
	public void myMultiPrint(int cnt) {
		start();
		for(int i=0;i<cnt;i++) {
			print();
		}
		finish();
	}
}

 

StringDisplayImpl : 구현부 클래스(문자열을 출력하는 구현체)

public class StringDisplayImpl extends DisplayImpl {

	private String str;
	
	public StringDisplayImpl(String str) {
		this.str = str;
	}
	
	@Override
	public void start() {
		System.out.println(">>start");
	}

	@Override
	public void print() {
		System.out.println(str);
	}

	@Override
	public void finish() {
		System.out.println(">>finish");
	}
}

 

Main : Test클래스

public class Main {

	public static void main(String[] args) {
		Display d1 = new Display(new StringDisplayImpl("test"));
		d1.myPrint();
		
		MultiDisplay d2 = new MultiDisplay(new StringDisplayImpl("test2"));
		d2.myMultiPrint(2);
	}
}

 

2. 특징

-기능부와 구현부를 확장할 때 서로 영향을 끼치지 않음 (확장성이 좋음)

    - 기능부를 추가해도 기존 구현부를 사용할 수 있고 구현부의 수정도 필요없다.

    - 구현부도 마찬가지

- 기능부와 구현부을 상속이 아닌 위임 방식으로 연결

 

3. 해당 패턴을 고려해볼만한 상황

- 기능의 확장이 많이 예상되고 각 기능이 여러 상황에서 다르게 구현되어야 할 경우

- ex. 기능이 os에 따라 다르게 동작하고(구현부에서 확장) 여러 기능이 추가될 때(기능부에서 확장)

 

'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글

Composite 패턴  (0) 2021.01.24
strategy 패턴  (0) 2021.01.24
Abstract Factory 패턴  (0) 2021.01.16
Builder 패턴  (0) 2021.01.09
Prototpye 패턴  (0) 2021.01.03