이 글은 카페 주문 시스템에 데코레이터 패턴을 적용한 예제를 이용해 개념을 설명합니다.
아래의 클래스 다이어그램은 모 카페의 초창기 주문 시스템 클래스의 구성이다.
OCP(Open-Closed Principle)는 '소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다'는 프로그래밍 원칙
데코레이터 패턴(Decorator Pattern)으로 객체에 추가 요소를 동적으로 더할 수 있음.
데코레이터를 사용하면 서브 클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있음.
public abstract class Beverage {
protected String description = "음료입니다.";
public String getDescription() {
return description;
}
public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage {
protected Beverage beverage;
public abstract String getDescription();
}
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;
}
}
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;
}
}
public class Whip extends CondimentDecorator {
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", 휘핑크림";
}
public double cost() {
return beverage.cost() + 0.15;
}
}
public class Coffee {
public Coffee() {
Beverage espresso = new Espresso();
System.out.println(espresso.getDescription() + ": $" + espresso.cost());
Beverage darkRoast = new Whip(new Mocha(new HouseBlend()));
System.out.println(darkRoast.getDescription() + ": $" + darkRoast.cost());
}
}
에스프레소 커피: $1.99
하우스 블렌드 커피, 모카, 휘핑크림: $1.24