Don't give up!

[Design Pattern] 데코레이터 패턴 (Decorator Pattern) 본문

개발서적/Head First Design Patterns

[Design Pattern] 데코레이터 패턴 (Decorator Pattern)

Heang Lee 2021. 8. 31. 23:48
이 글은 에릭 프리먼의 'Head First Design Patterns'를 읽고 TIL(Today I Learned)로써 정리한 내용을 기록하는 글입니다.
자세한 내용은 책을 통해 확인하실 수 있습니다.

알라딘: Head First Design Patterns (aladin.co.kr)

 

Head First Design Patterns

볼 거리가 많고 재미있으면서도, 머리 속에 쏙쏙 들어오는 방식으로 구성된 Head First 시리즈. 패턴의 근간이 되는 객체지향 디자인 원칙, 중요한 패턴, 디자인 적용 방법, 쓰지 말아야 하는 이유

www.aladin.co.kr

데코레이터 패턴(Decorator Pattern)

데코레이터 패턴은 객체에 기능을 동적으로 추가할 수 있도록 만드는 패턴입니다.

데코레이터 패턴은 클래스를 상속받는 데코레이터가 부모 클래스와 has-a 관계를 가지면서 그 객체의 메소드의 호출 결과에 새로운 기능을 추가할 수 있게 합니다.

이는 확장에 대해서는 열려 있지만 변경에 대해서는 닫혀 있어야 하는 객체지향 원칙(OCP)에 부합합니다.

데코레이터는 이를 상속받은 다른 데코레이터와 has-a 관계를 형성할 수 있습니다.

구성 요소를 감싸는 데코레이터의 개수에 제한이 없기 때문에 데코레이터 패턴을 남발할 경우 코드가 필요 이상으로 복잡해질 수 있다는 단점이 있습니다.

public abstracrt class Beverage {
  String description = "제목 없음";
  
  public String getDescription() {
    return description;
  }
  
  public abstract double cost();
}

public abstract class CondimentDecorator extends Beverage {
  public abstract String getDescription();
}

public class Espresso extends Beverage {
  public Espresso() {
    description = "에스프레소";
  }
  
  public double cost() {
    return 1.99;
  }
}

public class Mocha extends CondimentDecorator {
  Beverage beverage;
  
  public Mocha(Beverage beverage){
    this.beverage = beverage;
  }
  
  public String getDescription() {
    return beverage.getDescription() + ", 모카";
  }
  
  public double cost() {
    return .20 + beverage.cost();
  }
}