책 [JAVA 언어로 배우는 디자인 패턴 입문 3판;유키 히로시 저]을 참고하여 작성하였습니다.
객체에 장식이 되는 기능들을 하나씩 추가
장식틀과 내용물을 동일시한다
내용물을 변경하지 않고 기능을 추가
→ 투과적인 인터페이스(API)를 유지한 채 객체를 차례로 씌워 기능을 추가한다
Component 기능을 추가할 때 핵심이 되는 역할 Display
ConcreteComponent Component를 구현하는 구체 클래스
Decorator 새로운 기능(장식) Component를 가지고 있음
ConcreteDecorator Decorator클래스를 구현하는 구체 클래스
Display 문자열 표시용 추상 클래스
StringDisplay Display를 상속하는 구체 클래스, 핵심 문자열
Border 장식틀 추상 클래스, Display의 하위 클래스
SideBorder, FullBorder Border를 상속하는 구체 클래스
Border 클래스는 Display 형의 display 필드를 가지고 있다. 다른 말로 Border와 Display는 상속 관계이자 포함 관계에 있다. 따라서 장식틀은 내용물인 display에 접근할 수 있다. 가운데 내용물을 중심으로 주위에 장식을 더해갈 때 원래의 내용물이 어떤 상태인지 알 수 있는 것이다.
public abstract class Border extends Display {
protected Display display;
protected Border(Display display) {
this.display = display;
}
}
그러면 Display에서 선언한 메서드(사실은 하위 구체 클래스의 메서드)를 이용하여 원래 내용물 정보에 새로운 정보를 추가할 수 있다.
public class SideBorder extends Border {
private char borderChar; // 장식 문자
public SideBorder(Display display, char ch) {
super(display);
this.borderChar = ch;
}
@Override
public int getColumns() {
return 1 + display.getColumns() + 1; // 좌우에 장식 문자 추가
}
@Override
public int getRows() {
return display.getRows(); // 좌우에 장식 문자를 추가하는 것이기 때문에 row는 변함 없음
}
@Override
public String getRowText(int row) {
return borderChar + display.getRowText(row) + borderChar;
}
}
장식틀을 사용해 내용물을 감싸도 인터페이스(API)는 전혀 가려지지 않고 다른 클래스에서도 볼 수 있다. 이때 내용물인 인터페이스(API)을 투과적이라고 표현한다. 장식틀을 많이 사용해도 인터페이스는 변경되지 않고 겉에 둘러싼 클래스에서 확인할 수 있다. 이러한 형태는 파일 시스템에서 볼 수 있다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
'문제 및 이론 정리 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Composite - 그릇과 내용물을 동일시한다 (0) | 2025.02.23 |
---|---|
[디자인패턴] Proxy - 필요해지면 만든다 (0) | 2025.02.22 |
[디자인패턴] Visitor - 데이터 구조를 돌아다니면서 처리한다 (0) | 2025.02.18 |
[디자인패턴] Iterator - 처리를 반복한다 (1) | 2025.02.18 |
[디자인패턴] Bridge - 기능 계층과 구현 계층을 분리한다 (2) | 2025.02.04 |