프로그래밍/Design_Pattern

[Design_Pattern] 데코레이터 패턴(Decorator Pattern)

Lim-Ky 2017. 8. 25. 22:24
반응형

안녕하세요. Limky 입니다. 이번 시간에는 

데코레이터 패턴(Decorator Pattern)에 대해서 알아보겠습니다.

 

Decorator 는 우리말로 장식자라는 뜻을 가지고 있습니다. 말 그래도 원본에 대해서 무언가를 더 입혀서 새로운 것을 만든다는 뜻입니다.

자 끝났습니다. Decorator는 Proxy패턴하고 똑같습니다. 다만 차이점이 있다면, Proxy 패턴은 반환값을 수정하지 않고 온전하게 반환하지만, Decorator는 반환 값을 조작해서 반환합니다. 

 

바로 Decorator 패턴에 대한 디자인 패턴 테이블을 보겠습니다.

 

 

 

데코레이터 패턴(Decorator Pattern)은 반환 값에 장식을 더한 것을 빼면 프록시 패턴과 동일합니다. 바로 예제를 통해서 알아보겠습니다.

 

Cake.java

public class Cake {

	public String getCake() {
		return "케이크";
	}
}

CreamDecorator.java

public class CreamDecorator extends Cake{
	private Cake cake;
	
	public CreamDecorator(Cake cake) {
		this.cake = cake;
	}
	
	@Override
	public String getCake() {
		return "*생크림* "+cake.getCake() + " *생크림*";
		
	}
}

StrawberryDecorator.java

public class StrawberryDecorator extends Cake{
	private Cake cake;
	
	public StrawberryDecorator(Cake cake) {
		this.cake = cake;
	}
	
	@Override
	public String getCake() {
		return "@딸기@ "+cake.getCake() + " @딸기@";
		
	}
}

Main.java

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Cake cake = new Cake();
		System.out.println(cake.getCake());
		
		CreamDecorator creamCake = new CreamDecorator(cake);
		System.out.println(creamCake.getCake());
		
		StrawberryDecorator strawberryCake = new StrawberryDecorator(creamCake);
		System.out.println(strawberryCake.getCake());
		
	}

}

 

*결과 값

케이크

*생크림* 케이크 *생크림*

 

@딸기@ *생크림* 케이크 *생크림* @딸기@

 

데코레이터는 앞서 말했듯이 대신 메서드를 호출하면서, 반환 값에 추가적으로 더 덧붙여서 결과값을 반환합니다. 코드를 차근차근 살펴보면, Cake라는 클래스를 상속받는 Cream,Strawberry 클래스들은 데코레이터가 되어서 대신 getCake메서드를 호출하면서 추가적으로 결과 값에 각자의 장식을 더해서 결과를 반환합니다. 

 

처음 cake는 단순 cake였지만, Decorator를 2번 거치면서 딸기크림케이크가 된 것을 확인 할 수 있습니다. 

 

 

 

 

 

반응형