1 분 소요

SOLID중 O(Open-Closed Principle)에 가장 어울리는 디자인 패턴인 데코레이터 패턴에 대한 포스팅입니다.

정의

객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터 패턴을 사용 시 서브클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할 수 있다.

간단하게 코드로 보시죠

public abstract 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 = "에스프레소";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}


public class HouseBlend extends Beverage{

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

    @Override
    public double cost() {
        return 0.89;
    }
}


public class Mocha extends CondimentDecorator {

    Beverage beverage;

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

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

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


public class Soy extends CondimentDecorator {

    Beverage beverage;

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

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

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", 두유";
    }
}


public class Whip extends CondimentDecorator {

    Beverage beverage;

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

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

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", 휘핑";
    }
}
public class testCode {

    public static void main(String[] args) {
        //에소프레소
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());

        //에소프레소에 휘핑하고 모카 추가
        Beverage beverage2 = new Espresso();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

        //하우스블랜드커피에 모카와 두유추가
        Beverage beverage3 = new HouseBlend();
        beverage3 = new Mocha(beverage3);
        beverage3 = new Soy(beverage3);
        System.out.println(beverage3.getDescription() + " $" + beverage3.cost());

    }
}

데코레이터 클래스로 객체를 감싸고 추가 요소가 필요할시 감싼 객체와 함께 데코레이터로 감쌉니다.(마트료시카가 생각나네요.)

예제 코드는 https://github.com/Picbel/TIL.designPattern 참고부탁드립니다.

댓글남기기