= Bridge Pattern =
2종류의 확장이 혼재하는 프로그램을 **__기능 계층__과 __구현 계층__으로 분리**하고, 그 사이를 **위임**으로 **연결**
* 클래스 계층의 역할
* 기능 클래스 계층
* 상위 클래스는 기본적인 기능을 가지고 있다.
* 하위 클래스에서 **새로운 기능 추가**한다.
* 구현 클래스 계층
* 상위 클래스는 추상 메소드에 의해 인터페이스(API)를 규정한다.
* 하위 클래스는 구상 메소드에 의해 **인터페이스(API)를 구현**한다.
* 클래스 계층의 혼재와 분리
* **__하위 클래스를 만들려고 할 때__,** **__기능을 추가하려는가? 구현을 하려는가?__**
* 언제 쓰지? 장점?
* 예를 들어 어떤 프로그램을 배포하는데 각 OS별로 **의존(구현 계층)**하는 부분이 다른 경우
* 기능 계층과 구현 계층 따로 확장이 가능하고, 한 계층을 수정하는 데 다른 계층을 전혀 수정할 필요가 없음!
{{tag>Architecture Modeling Design_Pattern Structural}}
= 기능의 클래스 계층 =
package func;
import impl.DisplayImpl;
public class Display {
private DisplayImpl impl; // 위임(떠넘기기). Loose Coupling.
public Display(DisplayImpl impl) {
super();
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void print() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
package func;
import java.util.stream.IntStream;
import impl.DisplayImpl;
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
IntStream.range(0, times).forEach(i -> print());
close();
}
}
= 구현의 클래스 계층 =
package impl;
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
package impl;
import java.util.stream.IntStream;
public class StringDisplayImpl extends DisplayImpl {
private String str;
private int width;
public StringDisplayImpl(String str) {
this.str = str;
this.width = str.getBytes().length;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + str + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
IntStream.range(0, width).forEach(i -> System.out.print("-"));
System.out.println("+");
}
}
= Client =
import func.CountDisplay;
import func.Display;
import impl.StringDisplayImpl;
import func.CountDisplay;
import func.Display;
import impl.StringDisplayImpl;
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
CountDisplay d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
d1.display();
System.out.println();
d2.display();
d2.multiDisplay(3);
}
}
/*
+-------------+
|Hello, Korea.|
+-------------+
+------------+
|Hello, World|
+------------+
+------------+
|Hello, World|
|Hello, World|
|Hello, World|
+------------+
*/