데코레이터 패턴은
- 객체에 추가 요소를 동적으로 더할 수 있습니다.
- 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있습니다.
구현
Component
//인터페이스 사용해도 무방
public abstract class Beverage {
String description = "제목 없음";
public String getDescription() {
return description;
}
public abstract double cost();
}
ConcreteComponent
ConcreteComponent에 행동을 동적으로 추가합니다.
public class Espresso extends Beverage{
public Espresso() {
description = "에스프레소";
}
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage{
public HouseBlend() {
description = "하우스 블렌드 커피";
}
public double cost() {
return 0.89;
}
}
Decorator
자신이 장식할 구성 요소(Component)와 같은 인터페이스 또는 추상 클래스를 구현합니다.
//Condiment == 첨가물
public abstract class CondimentDecorator extends Beverage {
Beverage beverage;
public abstract String getDescription();
}
ConcreteDecorator
Component의 상태를 확장할 수 있습니다.
새로운 메소드를 추가할 수도 있고, 원래 있던 메소드를 별도의 작업으로 처리해서 새로운 기능을 추가합니다.
public class Mocha extends CondimentDecorator{
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 모카";
}
public double cost() {
return beverage.cost() + 0.20;
}
}
데코레이터 패턴의 장점은 뭘까요?
- 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같습니다.
- 한 객체를 여러 개의 데코레이터로 감쌀 수 있습니다.
- 원래 객체가 들어갈 자리에 데코레이터 객체를 넣어도 상관없습니다.
- 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 일 말고도 추가 작업을 수행할 수 있습니다.
- 객체는 언제든지 감쌀 수 있으므로 실행 중에 필요한 데코레이터를 마음대로 적용할 수 있습니다.
데코레이터 패턴의 단점을 뭘까요?
- 자잘한 클래스가 많이 생깁니다.
- 구성요소를 초기화하는 데 필요한 코드가 훨씬 복잡해집니다.
- 특정 형식에 의존하는 클라이언트에 적용할 수 없습니다.
출처
에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022
'Design Pattern' 카테고리의 다른 글
커맨드 패턴 (Command Pattern) (0) | 2023.09.27 |
---|---|
싱글턴 패턴(Singleton Pattern) (2) | 2023.09.25 |
팩토리 패턴(Factory Pattern) (0) | 2023.09.14 |
옵저버 패턴(Observer Pattern) (0) | 2023.09.07 |
전략 패턴(Strategy Pattern) (0) | 2023.09.06 |