- 정의
- 객체에 추가 요소를 동적으로 더할 수 있음
- 훨씬 유연한 확장
- 데코레이터 객체를 조합함으로써 추가 기능을 설계
- 카페
//추상 클래스
public abstract class Beverage {
public enum Size {TALL, GRANDE, VENTI};
Size size = Size.TALL;
String description = "제목 없음";
//getDescription 구현
public String getDescription() {
return description;
}
public void setSize(Size size) {
this.size = size;
}
public Size getSize() {
return this.size;
}
//cost()는 서브클래스에서 구현해야 함
public abstract double cost();
}
//Beverage클래스 확장
public abstract class CondimentDecorator extends Beverage{
//Beverage 객체 저장
Beverage beverage;
//모든 첨가물 데코레이터에 getDescription()메소드 구현 예정 -> 추상 메소드 선언
public abstract String getDescription();
public Size getSize() {
return beverage.getSize();
}
}
public class Espresso extends Beverage{
public Espresso() {
//description 변수 값 설정
description = "Espresso";
}
//에스프레소 가격 리턴
public double cost(){
return 3800;
}
}
public class HouseBlend extends Beverage{
public HouseBlend() {
description = "하우스 블렌드 커피";
}
//하우스 블렌드 가격 리턴
public double cost() {
return 2500;
}
}
-----------------------------------------------
public class Decaf extends Beverage{
public Decaf() {
description = "Decaf Coffee";
}
public double cost() {
return 3200;
}
}
-----------------------------------------------
public class DarkRoast extends Beverage{
public DarkRoast() {
description = "Dark Roast Coffee";
}
public double cost(){
return 2800;
}
}
public class Mocha extends CondimentDecorator{
//Beverage 레퍼런스
//음료를 저장하는 인스턴스 변수, 객체로 설정하는 생성자가 필요
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription(){
//모카를 더한 값 리턴
return beverage.getDescription() + ", 모카";
}
public double cost() {
//모카를 추가한 가격을 리턴;
return beverage.cost() + 300;
}
}
public class Milk extends CondimentDecorator{
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", milk";
}
public double cost() {
return beverage.cost() + 100;
}
}
_____________________________________________________________
public class Soy extends CondimentDecorator{
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", soy";
}
public double cost() {
return beverage.cost() + 100;
}
}
______________________________________________________________
public class Whip extends CondimentDecorator{
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", whip";
}
public double cost() {
return beverage.cost() + 200;
}
}
public class OrderCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " W" + beverage.cost());
Beverage beverage1 = new DarkRoast();
beverage1.setSize(Size.TALL);
//모카로 감쌈
beverage1 = new Mocha(beverage1);
//모카로 감쌈
beverage1 = new Mocha(beverage1);
//휘핑으로 감쌈
beverage1 = new Whip(beverage1);
System.out.println(beverage1.getSize() + "size " + beverage1.getDescription() + " W" + beverage1.cost());
Beverage beverage2 = new HouseBlend();
//두유로 감쌈
beverage2 = new Soy(beverage2);
//우유로 감쌈
beverage2 = new Milk(beverage2);
//모카로 감쌈
beverage2 = new Mocha(beverage2);
System.out.println(beverage2.getDescription() + " W" + beverage2.cost());
}
}
GitHub - Pearlmoon997/Design_Patterns: Design_Patterns
Design_Patterns. Contribute to Pearlmoon997/Design_Patterns development by creating an account on GitHub.
github.com
참고문서: 헤드퍼스트 디자인패턴(개정판)
'디자인패턴' 카테고리의 다른 글
Decorator Pattern_ver.02(스포츠카) (0) | 2022.05.24 |
---|---|
Builder Pattern (0) | 2022.05.23 |
Singleton Pattern_ver.02 (0) | 2022.05.22 |
Singleton Pattern (0) | 2022.05.21 |
Factory Method_ver.02 (햄버거) (0) | 2022.05.19 |