<디자인패턴입문> 9. Decorator 패턴
by BFine반응형
www.yes24.com/Product/Goods/2918928
가. 무엇인가
a. 스펀지 케이크에 덧칠하듯!
- 스펀지 케이크에 크림을 바르고 딸기를 얹고 초콜릿으로 장식하고 초를 꽃으면 생일케이크 완성
=> 이처럼 객체도 장식해 나가는 디자인 패턴을 데코레이터 패턴이라고 한다.
나. 만들어본 예제
a. Component 역할
- 기능이 추가되는 핵심이 되는 역할의 인터페이스
public interface Base {
String cake();
}
b. ConcreteComponent 역할
- 인터페이스를 구현하여 장식 되어질 실질적인 핵심이 되는 부분
public class Cake implements Base{
@Override
public String cake() {
return "스펀지케이크";
}
}
c. Decorator 역할
- Component 역할과 동일한 인터페이스를 가지면서 장식할 대상(Component)를 가지고 있는 추상클래스
- Decorator 역할을 Component 역할과 동일시 하는 가장 중요한 부분이다.
public abstract class Decorator implements Base {
private Base base;
public Decorator(Base base) {
this.base = base;
}
@Override
public String cake() {
return base.cake();
}
}
d. ConcreteDecorator 역할
- 실제 Decorator를 구현하여 장식하는 부분
public class Cream extends Decorator{
public Cream(Base base) {
super(base);
}
@Override
public String cake() {
return "크림|"+super.cake()+"|크림";
}
}
public class Strawberry extends Decorator{
public Strawberry(Base base) {
super(base);
}
@Override
public String cake() {
StringBuilder sb = new StringBuilder();
String cake = super.cake();
int index = cake.indexOf("스펀지");
for (int i = 0; i <= index; i++) {
sb.append(" ");
}
sb.append("딸기딸기딸기\n");
sb.append(cake);
return sb.toString();
}
}
e. Main
public class Main {
public static void main(String[] args) {
Base base = new Strawberry(new Cream(new Cake()));
String complete = base.cake();
System.out.println(complete);
}
}
/** 실행
"C:\Program Files\Java\jdk-11.0.8\bin\java.exe"
딸기딸기딸기
크림|스펀지케이크|크림
Process finished with exit code 0
**/
다. 정리
a. 투과적인 인터페이스.
- Composite와 닮은 재귀적인 구조가 등장, 내용물이 실제로는 다른 장식이 되는 구조
- 데코레이터 패턴은 테두리 장식을 중복해서 기능을 추가해가는 것에 주안점을 둔다.
b. 기능추가
- 장식되는 내용물은 수정할필요가 없기 때문에 내용물을 변경하지 않고 기능을 추가할 수 있다.
- 또한 위임 통해 구현하므로 런타임에 동적인 기능을 추가할 수 있다.
c. Java I/O
- java.io 패키지에 패턴을 잘 사용한 부분이 있다.
- 버퍼링을 할것인지 행번호를 관리할것인지 아니면 둘다 할 것인지를 데코레이터 패턴을 사용한것을 볼 수 있다.
Reader reader = new FileReader("test.txt");
Reader reader = new BufferedReader( new FileReader("test.txt"));
Reader reader = new LineNumberReader(new BufferedReader( new FileReader("test.txt")));
데코레이터 패턴은 내용물과 장식을 동일시하여 내용물을 꾸미는 패턴이다.
반응형
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 11. Chain of Responsibility 패턴 (0) | 2021.05.04 |
---|---|
<디자인패턴입문> 10. Visitor 패턴 (0) | 2021.05.03 |
<디자인패턴입문> 8. Composite 패턴 (0) | 2021.05.01 |
<디자인패턴입문> 7. Strategy 패턴 (0) | 2021.04.30 |
<디자인패턴입문> 6. Abstract Factory 패턴 (0) | 2021.04.26 |
블로그의 정보
57개월 BackEnd
BFine