데코레이터 패턴
늘 그랬듯이 클래스 다이어그램부터 살펴보자.
천천히 알아보자.
데코레이터 패턴이란?
- decorate: 장식하다.
- 객체에 추가 요소를 동적으로 더할 수 있다.
- 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.
이해를 돕기 위해 예를 들어보자. 헤드 퍼스트 디자인 패턴 책의 예제를 가져왔다.
예제 : 스타버즈 커피
문제
빠른 성장세에 다양한 음료들을 모두 포괄하는 주문 시스템을 갖추려고 하는 스타버즈 커피숍이 있다. 초기 시스템은 아래와 같다.
문제점은 여기서 발생한다. 시스템은 구축해놓았는데 모카나 우유나 휘핑 크림 같은 추가 토핑을 추가해야 할 때, 또는 가격이 변동될 때 상속받는 클래스가 아래와 같이 너무 많아진다는 것이다. (ex 휘핑 크림을 얹은 모카 에스프레소 클래스... 이런 것 까지 따로 구현해야 한다.)
이를 데코레이터 패턴을 적용하여 개선시켜보자!!
이런 식으로 적용하면 "휘핑 크림은 얹고 모카를 넣은 DarkRoast 클래스" 를 만들 때 이 자체의 클래스를 만드는 것이 아니라 구성하는 객체들이 감싸주기만 하면 된다. 아래처럼 말이다.
코드로 살펴보자.
Beverage.java
public abstract class Beverage {
String description = "제목 없음";
public String getDescription(){
return description;
}
public abstract double cost();
}
DarkRoast.java
public class DarkRoast extends Beverage{
public DarkRoast(){
description = "다크 로스트";
}
@Override
public double cost() {
return 0.99;
}
}
CondimentDecorator.java
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
@Override
public abstract double cost();
}
Moch.java
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return "모카 " + beverage.getDescription();
}
@Override
public double cost() {
return 0.2 + beverage.cost();
}
}
Whip.java
public class Whip extends CondimentDecorator{
Beverage beverage;
public Whip(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return "휘핑 " + beverage.getDescription();
}
@Override
public double cost() {
return 0.1 + beverage.cost();
}
}
이제 처음 봤던 클래스 다이어그램을 보며 마무리하자.
- Component : 각 구성요소는 직접 쓰일 수도 있고 데코레이터로 감싸져서 쓰일 수도 있다 (클래스 or 인터페이스)
- ConcreteComponent : 새로운 행동을 동적으로 추가 (DarkRoast)
- Decorator : 자신이 장식할 구성요소와 같은 인터페이스 또는 추상 클래스의 역할 (CondimentDecorator)
- ConcreteDecorator : 객체가 장식하고 있는 것을 위한 인스턴스 변수가 존재 (Whip, Mocha)
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] Adapter Pattern (0) | 2023.12.09 |
---|---|
[디자인 패턴] 컴포지트 패턴 (Composite Pattern) (0) | 2023.12.09 |
[디자인 패턴 기초] 빌더 패턴 (Builder Pattern) (0) | 2023.10.17 |
[디자인 패턴 기초] 싱글턴 패턴 (Singleton Pattern) (1) | 2023.10.07 |
[디자인 패턴 기초] 옵저버 패턴(observer pattern) (0) | 2023.09.26 |