suyeonme

[디자인 패턴] 데코레이터 패턴(Decorator Patter) 본문

프로그래밍👩🏻‍💻/디자인 패턴

[디자인 패턴] 데코레이터 패턴(Decorator Patter)

suyeonme 2022. 6. 19. 22:21
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다.

1. 문제 상황

1. 유명 커피 전문점은 주문 시스템을 개선하려고 한다.

2. 고객은 커피를 주문할 때 우유, 두유, 모카등을 추가할 수 있다. 각각을 추가할 때 마다 커피의 가격은 변한다.

3. 첨가물은 추가되거나 제거되는등 변경될 수 있다. 

 

2. 데코레이터 패턴으로 문제 해결

2.1 데코레이터 패턴(Decorator Pattern)이란?

객체에 추가 요소를 동적으로 더할 수 있는 디자인 패턴이다. 데코레이터를 사용하면 서브 클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.

이미지 출처: https://miro.medium.com/max/1194/1*nM0JRjh_gGvkqBZJCOInGg.png

 

데코레이터를 적용하는 방법은 아래와 같다. (고객이 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());
Comments