Java & 배경지식/패턴

데코레이터 패턴

레알윙 2020. 2. 17. 20:40
반응형

 

데코레이션 테스트 구조

 

public interface Car {
    public void assemble();
}
public class BasicCar implements Car {
    @Override
    public void assemble() {
        System.out.print("Basic Car.");
    }
}
public class CarDecorator implements Car {
    protected Car car;
    
    public CarDecorator(Car c){
        this.car=c;
    }
    
    @Override
    public void assemble() {
        this.car.assemble();
    }
}
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.");
    }
}
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.");
    }
}
public class Test {

	 public static void main(String[] args) {
	        Car sportsCar = new SportsCar(new BasicCar());
	        sportsCar.assemble();

	        System.out.println("\n*****");
			//방법 1
	        Car sportsLuxuryCar = new LuxuryCar(new SportsCar(new BasicCar()));
            //방법 2
            Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
	        sportsLuxuryCar.assemble();

	        System.out.println("\n*****");

	        // 안되는 코드들
//	        Car car = new LuxuryCar(new SportsCar());
//	        Car car2 = new SportsCar(new LuxuryCar());
	    }
}

위의 코드 결과

 

 

데코레이터 패턴이란?

  • 타깃에 부가적인 기능을 런타임 시 다이내믹하게 부여해주기 위해서 프록시를 사용하는 패턴
    • 다이나믹이란
      • 컴파일 시점, 즉 코드상에서는 어떤 방법과 순서로 프록시와 타깃이 연결되어 사용되는지 정해져 있지 않다는 뜻
  • 프록시가 한개로 제한되지 않으며, 프록시가 직접 타깃을 사용하도록 고정시킬필요가 없다.
  • 인터페이스를 구현한 타켓과 여러개의 프록시를 사용 가능
  • 순서를 정해서 단계적으로 위힘하는 구조로 만들면 됨
  • 결과를 보게 된다면 기본차가  부품추가해서 스포츠카가되고, 럭셔리한 자동차가 된다. 이렇게 객체를 꾸며주는 것이 데코레이터 패턴이라한다.
  • 데코레이션은 순서에 상관없고, 꾸밀 속성을 가지는 기본 객체가 꼭 필요

 

참고 

https://meaownworld.tistory.com/91

토비의 스프링

반응형