본문 바로가기

Design Pattern

2. Decorator Pattern

요약: 상황에 맞춰서 유연하게 객체를 생성하는 패턴. 기능 확장이 필요할때 고려해볼만한 패턴 중 하나이다.

 

샘플코드(Java) : 대표적인 예제 커피(음료)관련 코드이다. (커피의 추가 첨가물에 따라 가격이 동적으로 변하는 코드)

 

public abstract class Beverage {
    public abstract int price ();
}

제일 부모가 되는 클래스이다. 가격을 구하는 추상 메서드가 있다.

public class Espresso extends Beverage {

    @Override
    public int price () {
        System.out.println("espresso price = 150");
        return 150;
    }
}

음료의 한 종류인 Espresso 클래스 이다. 기본 가격은 150원이다.

public abstract class BeverageDecorator extends Beverage {
}

첨가물의 부모가 되는 클래스이다. 추후 첨가물(데코레이터만)의 기능을 추가할때 사용할 클래스이다.

public class Ice extends BeverageDecorator {

    private Beverage beverage;

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

    @Override
    public int price() {
        System.out.println("ice price = 30");
        return this.beverage.price() + 30;
    }
}
public class Whip extends BeverageDecorator {

    private Beverage beverage;

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

    @Override
    public int price() {
        System.out.println("whip price = 50");
        return this.beverage.price() + 50;
    }
}

 

둘다 같은 기능을 하는 코드인데 클래스명만 다르다. 각각의 데코레이터들은 Beverage객체를 생성할때 주입받아, 그 객체의 가격에 자기 자신의 가격을 + 한다.

 

public class Executor {

    public static void main(String[] args) {
        Beverage iceCoffee = new Ice(new Espresso());
        Beverage whipCoffee = new Whip(new Espresso());
        Beverage iceWhipCoffee = new Ice(new Whip(new Espresso()));
        System.out.println(iceCoffee.price());
        System.out.println(whipCoffee.price());
        System.out.println(iceWhipCoffee.price());
    }
}

실행 클래스이다. Beverage 객체를 생성할때 Beverage 클래스 안에 또 다른 Beverage 클래스를 생성자 인자로 넣어서 객체를 생성한다.

 

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

1. Observer Pattern  (0) 2020.05.05