기능부와 구현부를 나눈 후 그 사이를 연결하는 패턴
기능부 : 새로운 기능을 확장해가는 부분 (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 |