날씨는 무더운데
마스크를 끼고 다니려니
얼굴에 뭐가 나는거 같기도...
코로나19에 걸리기 전에
답답해서 죽을 것 같다는...
아무튼 답답함을 이기고
학습을 진행해야겠죠~^^
오늘의 학습 주제는
데코레이터 패턴(Decorator Pattern)입니다
데코레이터는 "장식을 하는 것"을 의미하는데
뭔가 느낌이 어떤 본판에
살을 붙이는 패턴일 것 같네요~
언제나 처럼 데코레이터 패턴의
역할들에 대해 정리하고 시작하겠습니다
역할 | 설명 |
Component | 기능을 추가할 때 핵심이 되는 역할이며 인터페이스만을 결정 |
Concrete Component | Component 역할의 인스턴스를 구현 |
장식자(Decorator) | Component 역할과 동일한 인터페이스를 가지고 Decorator 역할이 장식할 대상이 되는 Component 역할도 가짐 |
구체적인 장식자(Concrete Decorator) | 구체적인 Decorator 역할 |
역시 무슨 말인지 모르겠을 땐
무작정 구현을 해보는 것이 상책이겠죠?
1. 추상 클래스(Abstract Class) Display.java
package decoratorPattern;
public abstract class Display {
public abstract int getColumns();
public abstract int getRows();
public abstract String getRowText(int row);
public final void show() {
for ( int i = 0; i < getRows(); i++ ) {
System.out.println(getRowText(i));
}
}
}
2. 클래스(Class) StringDisplay.java
package decoratorPattern;
public class StringDisplay extends Display {
private String string;
public StringDisplay(String string) {
this.string = string;
}
public int getColumns() {
return string.getBytes().length;
}
public int getRows() {
return 1;
}
public String getRowText(int row) {
if ( row == 0 ) {
return string;
} else {
return null;
}
}
}
3. 추상 클래스(Abstract Class) Border.java
package decoratorPattern;
public abstract class Border extends Display {
protected Display display;
protected Border(Display display) {
this.display = display;
}
}
4. 클래스(Class) SideBorder.java
package decoratorPattern;
public class SideBorder extends Border {
private char borderChar;
public SideBorder(Display display, char ch) {
super(display);
this.borderChar = ch;
}
public int getColumns() {
return 1 + display.getColumns() + 1;
}
public int getRows() {
return display.getRows();
}
public String getRowText(int row) {
return borderChar + display.getRowText(row) + borderChar;
}
}
5. 클래스(Class) FullBorder.java
package decoratorPattern;
public class FullBorder extends Border {
public FullBorder(Display display) {
super(display);
}
public int getColumns() {
return 1 + display.getColumns() + 1;
}
public int getRows() {
return 1 + display.getRows() + 1;
}
public String getRowText(int row) {
if ( row == 0 ) {
return "+" + makeLine('-', display.getColumns()) + "+";
} else if ( row == display.getRows() + 1) {
return "+" + makeLine('-', display.getColumns()) + "+";
} else {
return "|" + display.getRowText(row - 1) + "|";
}
}
private String makeLine(char ch, int count) {
StringBuffer buf = new StringBuffer();
for ( int i = 0; i < count; i++ ) {
buf.append(ch);
}
return buf.toString();
}
}
6. 클래스(Class) Test.java
import decoratorPattern.*;
public class Test {
public static void main(String[] args) {
/* decorator Pattern */
Display display1 = new StringDisplay("Welcome!");
Display display2 = new SideBorder(display1, '#');
Display display3 = new FullBorder(display2);
display1.show();
display2.show();
display3.show();
}
}
이번 패턴을 잘보시면
장식을 나타내는 Border 클래스와
내용물을 나타내는 Display 클래스가
동일한 인터페이스를 가지고 있습니다
추상 클래스 Display에서
정의한 메소드가 그대로 노출되고
이것을 "투과적"인 인터페이스라고 합니다
이 때문에 지난 번에 학습한
Composite 패턴에서 등장한
재귀적인 구조가 나타날 수 있습니다
내용물이 장식이되고 장식이 내용물이되고...
내용물이 또 장식이되는...뭐...그런?
Composite 패턴이 궁금하시다면
아래의 링크 ↓↓
2020/07/05 - [Java] - [Design Pattern] 복합체 패턴(Composite Pattern)
이 패턴이 사용된 경우를 보면
java.io 패키지가 있습니다
Reader reader = new LineNumberReader(new BufferReader(new FileReader("test.txt")));
휴 벌써 12시가 다되어가네요
이것으로 오늘의 학습을 마치겠습니다
그럼 이만-_-
'Java' 카테고리의 다른 글
[Design Pattern] 책임 떠넘기기 패턴(Chain of Responsibility Pattern) (0) | 2020.07.12 |
---|---|
[Design Pattern] 방문자 패턴(Visitor Pattern) (0) | 2020.07.09 |
[Design Pattern] 복합체 패턴(Composite Pattern) (0) | 2020.07.05 |
[Design Pattern] 전략 패턴(Strategy Pattern) (0) | 2020.06.29 |
[Design Pattern] 브릿지 패턴(Bridge Pattern) (0) | 2020.06.23 |