the definition of Decorator Pattern
데코레이터 패턴은 다음과 같이 정의됩니다.
데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
Class Diagram
여기서 ContimentDecorator 클래스는 추상클래스로서 Beverage클래스의 구성요소이다. 즉 데코레이터 안에는 Component 객체가 들어있습니다. 구성요소에 대한 레퍼런스로서 인스턴스 변수가 들어가 있지요. 그러므로, Decorator는 자신이 장식할 구성요소와 같은 인터페이스 또는 추상 클래스를 구현합니다. ContimentDecorator를 구상하는 클래스는 그 객체가 장식하고 있는 Component객체(이 경우에는 Beverage 클래스)를 위한 인스턴스 변수가 있습니다. 데코레이터에서 새로운 메소드를 추가할 수도 있습니다. 하지만 일반적으로 새로운 메소드를 추가하는 대신 Component에 원래 있던 메소드를 호출하기 전, 또는 후에 별도의 작업을 처리하는 방식으로 새로운 기능을 추가합니다.
Implementation
예로서 위의 클래스 다이어그램에 나와있는 구상 클래스의 소스코드를 소개합니다. 먼저 음료(Beverage)를 구현한 소스코드입니다.
public class Espresso extends Beverage{ public Espresso(){ description = "espresso"; } public double cost(){ return 1.99; } }
public class HouseBlend extends Beverage( public HouseBlend(){ description = "HouseBlend coffee"; } public double cost(){ return .89; } }
이제 음료에 첨가되는 첨가물용 구상 데코레이터를 구현해보죠. 다음은 모카를 구현한 코드입니다.
public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } public String getDescription(){ return beverage.getDescription() + ", Mocha"; } public double cost(){ return .20 + beverage.cost(); } }