요약: 상황에 맞춰서 유연하게 객체를 생성하는 패턴. 기능 확장이 필요할때 고려해볼만한 패턴 중 하나이다.
샘플코드(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 |
---|