데코레이터 패턴이란?
객체의 추가적인 요건을 동적으로 첨가. 데코레이터는 서브클래스를 만드는 것을 통해서
기능을 유연하게 확장 할 수 있는 방법을 제공.
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
댓글 없음:
댓글 쓰기