오늘의 학습 주제는
브릿지(Bridge) 패턴입니다
브릿지 패턴은
'기능의 클래스 계층'과
'구현의 클래스 계층' 사이에
다리를 놓는 디자인 패턴입니다
앞서 학습했던 템플릿 패턴에서
추상 클래스가 일련의 메소드들을
추상 메소드로서 선언함으로써
인터페이스를 규정하고
하위 클래스에서 이것을
구현하는 것을 보았습니다
이것을 '구현의 클래스 계층'이라고 합니다
템플릿 패턴이 궁금하시다면
아래의 링크↓↓
2020/06/11 - [Java] - [Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)
'기능의 클래스 계층'은
어떤 클래스에 새로운 기능
즉 메소드를 추가하고 싶을 때
우리는 상속을 진행하는데
이러한 것을 말합니다
브릿지 패턴은
바로 이 두 개의 클래스 계층 간에
다리를 놓는 패턴입니다
먼저 브릿지 패턴의 역할들을
정리해보겠습니다
역할 | 설명 |
추상화(Abstraction) | '기능의 클래스 계층'의 최상위 클래스로서 Implementor 역할의 메소드를 사용해서 기본적인 기능만이 기술되어 있는 클래스 |
개선된 추상화(Refined Abstraction) | Abstraction 역할에 대해 기능을 추가한 역할 |
구현자(Implementor) | '구현의 클래스 계층'의 최상위 클래스로서 Abstraction 역할의 인터페이스를 구현하기 위한 메소드를 규정 |
구체적인 구현자(Concrete Implementor) | Implementor 역할의 인터페이스를 구체적으로 구현 |
역시 구현을 해봐야
이해가 좀 될 것 같습니다..
1. 클래스(Class) Display.java
package bridgePattern;
public class Display {
private DisplayImpl impl;
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();
}
}
2. 추상 클래스(Abstract Class) DisplayImpl.java
package bridgePattern;
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
3. 클래스(Class) StringDisplayImpl.java
package bridgePattern;
public class StringDisplayImpl extends DisplayImpl {
private String string;
private int width;
public StringDisplayImpl(String string) {
this.string = string;
this.width = string.getBytes().length;
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|");
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for ( int i = 0; i < width; ++i) {
System.out.print("-");
}
System.out.println("+");
}
}
4. 클래스(Class) CountDisplay.java
package bridgePattern;
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();
}
}
5. 클래스(Class) Test.java
import bridgePattern.*;
public class Test {
public static void main(String[] args) {
/* bridge Pattern */
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);
}
}
위의 코드에 대한 설명은 생략^^
브릿지 패턴을 사용하는 이유는
분리를 통한 확장의 용이성 때문인데요
'기능'과 '구현'의 분리되어 있기 때문에
기능을 추가하고 싶으면
기능의 클래스 계층에 클래스를 추가하고
구현을 추가하고 싶으면
구현의 클래스 계층에 클래스를 추가합니다
물론 어느쪽에 추가할 것인지를
판단하는 것은 프로그램 작성자의 몫이겠죠^^
오늘의 학습은 이것으로 마치고
다음은 전략 패턴(Strategy)에 대해 알아보겠습니다
브릿지 패턴을 다리 패턴이라 안한 이유는
뭔가 없어보여서...
그럼 이만-_-
'Java' 카테고리의 다른 글
[Design Pattern] 복합체 패턴(Composite Pattern) (0) | 2020.07.05 |
---|---|
[Design Pattern] 전략 패턴(Strategy Pattern) (0) | 2020.06.29 |
[Design Pattern] 추상적인 공장 패턴(Abstract Factory Pattern) (0) | 2020.06.21 |
[Design Pattern] 빌더 패턴(Builder Pattern) (0) | 2020.06.15 |
[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴 (0) | 2020.06.14 |