본문 바로가기
Design Pattern

데코레이터 패턴(Decorator Pattern)

by 밍상 2023. 9. 11.

데코레이터 패턴은

  • 객체에 추가 요소를 동적으로 더할 수 있습니다.
  • 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있습니다.

 

구현

Component

//인터페이스 사용해도 무방
public abstract class Beverage {
    String description = "제목 없음";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

ConcreteComponent

ConcreteComponent에 행동을 동적으로 추가합니다.

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

    public double cost() {
        return 1.99;
    }
}

public class HouseBlend extends Beverage{
    public HouseBlend() {
        description = "하우스 블렌드 커피";
    }

    public double cost() {
        return 0.89;
    }
}

Decorator

자신이 장식할 구성 요소(Component)와 같은 인터페이스 또는 추상 클래스를 구현합니다.

//Condiment == 첨가물
public abstract class CondimentDecorator extends Beverage {
    Beverage beverage;

    public abstract String getDescription();
}

ConcreteDecorator

Component의 상태를 확장할 수 있습니다.

새로운 메소드를 추가할 수도 있고, 원래 있던 메소드를 별도의 작업으로 처리해서 새로운 기능을 추가합니다.

public class Mocha extends CondimentDecorator{

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", 모카";
    }

    public double cost() {
        return beverage.cost() + 0.20;
    }
}

 

데코레이터 패턴의 장점은 뭘까요?

  • 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같습니다.
  • 한 객체를 여러 개의 데코레이터로 감쌀 수 있습니다.
  • 원래 객체가 들어갈 자리에 데코레이터 객체를 넣어도 상관없습니다.
  • 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 일 말고도 추가 작업을 수행할 수 있습니다.
  • 객체는 언제든지 감쌀 수 있으므로 실행 중에 필요한 데코레이터를 마음대로 적용할 수 있습니다.

데코레이터 패턴의 단점을 뭘까요?

  • 자잘한 클래스가 많이 생깁니다.
  • 구성요소를 초기화하는 데 필요한 코드가 훨씬 복잡해집니다.
  • 특정 형식에 의존하는 클라이언트에 적용할 수 없습니다.

 

출처

에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022

'Design Pattern' 카테고리의 다른 글

커맨드 패턴 (Command Pattern)  (0) 2023.09.27
싱글턴 패턴(Singleton Pattern)  (2) 2023.09.25
팩토리 패턴(Factory Pattern)  (0) 2023.09.14
옵저버 패턴(Observer Pattern)  (0) 2023.09.07
전략 패턴(Strategy Pattern)  (0) 2023.09.06