2010년 1월 22일 금요일

디자인 패턴의 세번째! 데코레이터 패턴(Decorator Pattern)

데코레이터 패턴이란?

  객체의 추가적인 요건을 동적으로 첨가. 데코레이터는 서브클래스를 만드는 것을 통해서

기능을 유연하게 확장 할 수 있는 방법을 제공.


OCP - 클래스는 확장에 대해서는 열려있어야 하지만

코드변경에 대해서는 닫혀있어야 한다.

  기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가 할 수 있도록 하는 것


데코레이터 패턴의 특징

 - 데코레이터의 수퍼클래스는 자신이 장식하고 있는 수퍼클래스와 같다.

 - 한 객체를 여러개의 데코레이터로 감쌀 수 있다.

 - 데코레이터는 자신이 감싸고 있는 객체와 같은 수퍼클래스를 가지고 있기 때문에 원래

    객체(쌓여져 있는 객체)가 들어갈 자리에 데코레이터 객체를 집어넣어도 상관이 없다.

 - 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임 하는것 외에

   원하는 추가적인 작업을 수행할 수 있다.

- 객체는 언제든지 감쌀 수 있기 때문에 실행중에 필요한 데코레이터를 마음대로

   적용할 수 있다.


<클래스 다이어그램>


 

커피 가격 프로그램

 

  위와 같이 할 경우 우유나 모카 등을 추가할 경우 Milk DarkRoast, Mocha DarkRoast, Milk Espresso, Mocha Espresso 등 클래스가 엄청나게 늘어나게 됨


인터페이스와 수퍼클래스 상수를 사용할 경우

 

 

문제점 : 첨가물의 가격이 바뀔 때마다 기본 코드수정을 해야하고 첨가물의 종류가 많아지면 새로운 메소드 추가, 수퍼클래스의 cost()도 수정해야 함. 아이스티 처럼 새로운 음료를 추가 할 때 들어가지 말아야 할 첨가물이 발생해도 상속을 받게 됨


데코레이터를 사용한 커피 가격 프로그램


<클래스 다이어그램>


데코레이터를 사용하는 코드

Beverage beverage = new DarkRoast(); //DarkRoast 객체를 만듦

beverage = new Mocha(beverage); // Mocha로 감쌈

beverage = new Milk(beverage); // Milk로 감쌈

 

beverage = new Milk(new Mocha)); // 위 두줄을 이렇게 한줄로 나타낼 수 도 있음

 

자바 입출력을 할 때 늘 사용되는 자바 IO 에서도 데코레이터가 사용되고 있음

 

출처 : Head First Design Patterns

댓글 없음:

댓글 쓰기