Notice
suyeonme
[디자인 패턴] 데코레이터 패턴(Decorator Patter) 본문
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다.
1. 문제 상황
1. 유명 커피 전문점은 주문 시스템을 개선하려고 한다.
2. 고객은 커피를 주문할 때 우유, 두유, 모카등을 추가할 수 있다. 각각을 추가할 때 마다 커피의 가격은 변한다.
3. 첨가물은 추가되거나 제거되는등 변경될 수 있다.
2. 데코레이터 패턴으로 문제 해결
2.1 데코레이터 패턴(Decorator Pattern)이란?
객체에 추가 요소를 동적으로 더할 수 있는 디자인 패턴이다. 데코레이터를 사용하면 서브 클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.
데코레이터를 적용하는 방법은 아래와 같다. (고객이 Dark Roast에 모카와 휘핑크림을 주문했다고 가정)
1. DarkRoast 객체를 생성한다.
2. Mocha 객체를 생성하고 이 객체로 DarkRoast 객체를 감싼다(장식).
3. Whip 객체를 생성하고 이 객체로 Mocha 객체를 감싼다(장식).
4. cost() 메소드를 호출한다. 이 때 첨가물의 가격을 계산하는 일은 해당 객체에게 위임한다.
2.2 코드 작성해보기
1. 커피 주문 시스템 코드 만들기
// 슈퍼 클래스
public abstract class Beverage {
String description = "";
public String getDescription() {
return description;
}
public abstract double cost();
}
// 첨가물 추상 클래스(데코레이터 클래스)
public abstract class CondimentDecorator extends Beverage {
Beverage beverage;
public abstract String getDescription();
}
2. 음료 코드 구현하기
// 서브 클래스
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "HouseBlend";
}
public double cost() {
return .89;
}
}
3. 첨가물(condiment) 코드 구현하기
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + "Mocha";
}
public double cost() {
return beverage.cost() + .20;
}
}
4. 커피 주문 시스템 코드 테스트하기
Beverage beverage = new Espresso();
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription());
System.out.println(beverage.cost());
'프로그래밍👩🏻💻 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 커맨드패턴(Command Pattern) (0) | 2022.07.10 |
---|---|
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2022.07.04 |
[디자인 패턴] 팩토리 패턴(Factory Pattern) (0) | 2022.06.26 |
[디자인 패턴] 옵저버 패턴(Observer Pattern) (0) | 2022.06.18 |
[디자인 패턴] 전략 패턴(Strategy Pattern) (0) | 2022.06.18 |
Comments