웹사이트 검색

Java 예제의 데코레이터 디자인 패턴


데코레이터 디자인 패턴은 런타임에 개체의 기능을 수정하는 데 사용됩니다. 동시에 동일한 클래스의 다른 인스턴스는 이에 의해 영향을 받지 않으므로 개별 개체가 수정된 동작을 얻습니다. 데코레이터 디자인 패턴은 구조적 디자인 패턴(구현할 컴포지션 등) 중 하나입니다.

데코레이터 디자인 패턴

  1. 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();
    }
    
  2. 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.");
    	}
    
    }
    
  3. 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();
    	}
    
    }
    
  4. Concrete Decorators - Extending the base decorator functionality and modifying the component behavior accordingly. We can have concrete decorator classes as LuxuryCar and SportsCar.

    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 등에서 많이 사용됩니다.