03. Decorator Pattern

객체에 추가적인 책임을 동적으로 부여
상속을 사용하지 않아도 유연하고 융통성 있는 기능 확장을 가능하게 함

  • Component: 각 구성 요소는 직접 쓰일 수도 있고 데코레이터로 감싸져서 쓰일 수도 있음 (class or interface)
  • ConcreteComponent: 새로운 행동을 동적으로 추가
  • Decorator: 자신이 장식할 구성요소와 같은 인터페이스 or 추상 클래스
  • ConcreteDecorator: 그 객체가 장식하고 있는 것

예시 - 스타버즈 음료

  1. Component
    기본이 되는 클래스 - 여기서부터 상속을 받음
public abstract class Beverage {
    private String description = "제목 없";

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}
  1. concreteComponent
public class HouseBlend extends Beverage{

    public HouseBlend() {
        super.setDescription("하우스 블렌드 커피");
    }

    @Override
    public double cost() {
        return .89;
    }
}
  1. Decorator
    추상 클래스로 구현
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
  1. ConcreteDecorator
public class Mocha extends CondimentDecorator{
    private Beverage beverage;
    
    public Mocha(Beverage beverage) {
        this.beverage = beverage;

    }

    @Override
    public double cost() {
        return  beverage.cost() + .20;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", 모카";
    }
}
  1. Main
public class Main {
    public static void main(String[] args) {
        Beverage beverage = new HouseBlend();
        beverage = new Mocha(beverage); // 데코레이터로 beverage 감싼다.

        System.out.println(beverage.getDescription());
    }
}

좋은 웹페이지 즐겨찾기