bridge. 다리라는 뜻이다.
둘 사이의 이어진 무언가란 뜻인데, 이 둘의 컨셉을 이해하는게 중요하다.
그게 뭐냐면
1. 기능의 클래스 계층
2. 구현의 클래스 계층
어떤 클래스가 있을 때, 이 클래스에 새로운 기능(메소드)을 추가하고 싶을 때 우리는 이 클래스를 상속하는 하위 클래스를 작성할 수 있다. 이때 부모자식간의 계층이 생겼는데
* 상위 클래스는 기본적인 기능을 가지고 있다.
* 하위 클래스에서 새로운 기능을 추가한다.
와 같은 특징을 가지고 있다.
이와 같은 클래스 계층을 '기능의 클래스 계층'이라고 한다.
또 다른 새로운 기능을 추가하려면 자식의 자식, 하위클래스를 하나도 더 생성함으로써 계층이 더욱 깊어졌다할수 있다.
템플릿 메소드 패턴처럼 어떤 인터페이스와 그것을 구현한 구현클래스의 관계에서도 계층을 확인할 수 있는데,
* 상위 클래스는 추상 메소드에 의해 인터페이스를 규정한다.
* 하위 클래스는 구상 메소드에 의해 그 인터페이스를 구현한다.
와 같은 특징을 가진 클래스 계층을 '구현의 클래스 계층'이라고 한다.
새로운 구현 객체가 필요하다면 해당 인터페이스를 구현(implement)한 concrete 클래스를 작성할 수 있다.
우리는 클래스를 작성하기 위해 우리의 의도를 다음과 같이 확인할 필요가 있다.
기능을 추가하려는건가? 구현을 수행하려는 건가?
클래스 계층이 하나라면 기능의 클래스 계층과 구현의 클래스 계층이 하나의 계층구조안에 섞여 읽기 힘든 코드가 될 우려가 있다.
분리하자.
각각을 독립된 클래스 계층으로 만들자.
그리고 이 둘 사이에 다리를 놓자.
비즈니스는 '무언가를 표시하기'이다.
package bridge;
/**
* '표시한다'는 클래스
* @author dev-jones
*
*/
public class Display {
private DisplayImpl impl; // bridge
public Display(DisplayImpl impl) {
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 bridge;
/**
* 기능의 클래스 계층
* '지정 횟수만큼 표시한다'는 기능을 추가하는 클래스
* @author dev-jones
*
*/
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) {
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
package bridge;
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, Korea."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World"));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe"));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}
실행결과:
+-------------+
|Hello, Korea.|
+-------------+
+------------+
|Hello, World|
+------------+
+---------------+
|Hello, Universe|
+---------------+
+---------------+
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
|Hello, Universe|
+---------------+
'자바' 카테고리의 다른 글
[자바] Proxy 패턴 (0) | 2021.06.12 |
---|---|
[자바] Abstract Factory 패턴 (0) | 2021.06.12 |
[자바] composite 패턴 (0) | 2021.06.06 |
[자바] Observer 패턴 (0) | 2021.06.03 |
[자바] 싱글톤이 보장받지 않는 상황 (0) | 2021.06.03 |