본문 바로가기

디자인패턴

Decorator Pattern_카페

  • 정의
    • 객체에 추가 요소를 동적으로 더할 수 있음
    • 훨씬 유연한 확장
    • 데코레이터 객체를 조합함으로써 추가 기능을 설계
  • 카페
//추상 클래스
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