Java 예제의 데코레이터 디자인 패턴
데코레이터 디자인 패턴은 런타임에 개체의 기능을 수정하는 데 사용됩니다. 동시에 동일한 클래스의 다른 인스턴스는 이에 의해 영향을 받지 않으므로 개별 개체가 수정된 동작을 얻습니다. 데코레이터 디자인 패턴은 구조적 디자인 패턴(구현할 컴포지션 등) 중 하나입니다.
데코레이터 디자인 패턴
-
Component Interface - The interface or abstract class defining the methods that will be implemented. In our case
Car
will be the component interface.package com.journaldev.design.decorator; public interface Car { public void assemble(); }
-
Component Implementation - The basic implementation of the component interface. We can have
BasicCar
class as our component implementation.package com.journaldev.design.decorator; public class BasicCar implements Car { @Override public void assemble() { System.out.print("Basic Car."); } }
-
Decorator - Decorator class implements the component interface and it has a HAS-A relationship with the component interface. The component variable should be accessible to the child decorator classes, so we will make this variable protected.
package com.journaldev.design.decorator; public class CarDecorator implements Car { protected Car car; public CarDecorator(Car c){ this.car=c; } @Override public void assemble() { this.car.assemble(); } }
-
Concrete Decorators - Extending the base decorator functionality and modifying the component behavior accordingly. We can have concrete decorator classes as
LuxuryCar
andSportsCar
.package com.journaldev.design.decorator; public class SportsCar extends CarDecorator { public SportsCar(Car c) { super(c); } @Override public void assemble(){ super.assemble(); System.out.print(" Adding features of Sports Car."); } }
package com.journaldev.design.decorator; public class LuxuryCar extends CarDecorator { public LuxuryCar(Car c) { super(c); } @Override public void assemble(){ super.assemble(); System.out.print(" Adding features of Luxury Car."); } }
데코레이터 디자인 패턴 - 클래스 다이어그램
데코레이터 디자인 패턴 테스트 프로그램
package com.journaldev.design.test;
import com.journaldev.design.decorator.BasicCar;
import com.journaldev.design.decorator.Car;
import com.journaldev.design.decorator.LuxuryCar;
import com.journaldev.design.decorator.SportsCar;
public class DecoratorPatternTest {
public static void main(String[] args) {
Car sportsCar = new SportsCar(new BasicCar());
sportsCar.assemble();
System.out.println("\n*****");
Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
sportsLuxuryCar.assemble();
}
}
클라이언트 프로그램은 런타임 시 다양한 종류의 개체를 생성할 수 있으며 실행 순서도 지정할 수 있습니다. 위 테스트 프로그램의 출력은 다음과 같습니다.
Basic Car. Adding features of Sports Car.
*****
Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
데코레이터 디자인 패턴 - 중요 포인트
- 데코레이터 디자인 패턴은 런타임 수정 기능을 제공하는 데 도움이 되므로 더 유연합니다. 선택 항목이 많을 때 유지 관리 및 확장이 쉽습니다.
- 데코레이터 디자인 패턴의 단점은 비슷한 종류의 객체(데코레이터)를 많이 사용한다는 점입니다.
- 데코레이터 패턴은 FileReader, BufferedReader 등에서 많이 사용됩니다.