# 설명
- 객체(오브젝트)에 동적으로 책임(기능)을 추가한다.
- 뜻 그대로 피자의 토핑을 하나씩 올리는거와 같이 기능을 하나씩 추가해 나간다.
- 상속을 사용하지 않고도 유연하게 기능의 확장이 가능하다. ( 특히 자바는 다중 상속을 지원하지 않는다 ).
- Component - 동적으로 추가할(될) 서비스를 가질 수 있는 객체 정의
- ConcreteComponent - 추가적인 서비스가 필요한 실제 구현 객체
- Decorator - Component의 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 정의
- ConcreteDecorator - 새롭게 추가되는 서비스를 실제 구현할 클래스로 addBehavior()을 통해 구현.
## 간단 예제
라면을 정의한 라면 클래스를 상속받는 카레라면과 너구리라면을 통해서, 각각의 카레라면, 너구리라면의 실 구현객체를 만들 수 있다.
아뿔싸! 카레 라면과 너구리라면을 합친 카구리라면을 만들고 싶다. 근데 별 수 없이 카레라면과 너구리라면을 재활용하지 못하고 카구리라면을 만들어야 하는 위기에 봉착했다. 어떻게 카구리라면을 재활용해 만들 수 있을까?
카레와 너구리를 데코레이터를 이용해 concrete 데코레이터로 만들어 라면구현객체에 카레와 너구리를 합쳐줘 카구리라면을 만들면 보다 쉽게 만들 수 있을 것이다.
그러나 한눈에 보기에, 작은 규모의 객체들이 많이 생성 될 수 있다는 단점이 보이기도 한다.
## 코드 예제
조합을 동적으로 결정할 수 있다. 즉 케냐+밀크+모카+밀크+모카를 위한 별도의 클래스를 생성하지 않고, 데코레이터를 활용해 동적으로 만들 수 있다.
# 코드
## Component
// Coffee
public abstract class Coffee {
public abstract void brewing();
}
## Concrete Component
기본 기능을 제공한다. ( 예제에서는 베이스가 되는 원두 )
// KeyaCoffee
public class KeyaCoffee extends Coffee{
@Override
public void brewing() {
System.out.print("KeyaCoffee");
}
}
// EtiopiaCoffee
public class EtiopiaCoffee extends Coffee{
@Override
public void brewing() {
System.out.print("EtiopiaCoffee ");
}
}
## Decorator
// Decorator
public abstract class Decorator extends Coffee {
Coffee coffee;
public Decorator(Coffee coffee){
this.coffee = coffee;
}
@Override
public void brewing() {
coffee.brewing();
}
}
## Concrete Decorator
super.brewing()을 호출해 상위의 기본기능을 수행하게하고 데코레이팅하는 기능을 추가한다.
// Latte
public class Latte extends Decorator{
public Latte(Coffee coffee) {
super(coffee);
}
@Override
public void brewing() {
super.brewing();
System.out.print(" +Adding Milk(Latte)");
}
}
// MochaCoffee
public class MochaCoffee extends Decorator{
public MochaCoffee(Coffee coffee) {
super(coffee);
}
@Override
public void brewing() {
super.brewing();
System.out.print(" +Ading Mocha Syrup");
}
}
# 테스트
// Test
public class Test {
public static void main(String[] args) {
// Coffee etiopiaCoffee = new EtiopiaCoffee();
Coffee keyaCoffee = new KeyaCoffee();
keyaCoffee.brewing();
System.out.println();
Coffee keyaLatte = new Latte(keyaCoffee);
keyaLatte.brewing();
System.out.println();
Coffee keyaLatteMocha = new MochaCoffee(keyaLatte);
keyaLatteMocha.brewing();
System.out.println();
Coffee keyaMochaLatte = new Latte(new MochaCoffee(new KeyaCoffee()));
keyaMochaLatte.brewing();
}
}
## 결과
# 참고
[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
'• 독서 > Design Pattern' 카테고리의 다른 글
[디자인패턴] 어댑터 패턴(Adapter Pattern) (0) | 2022.10.01 |
---|---|
[디자인 패턴] 컴포지트 패턴(Composite Pattern) (0) | 2022.09.30 |
[디자인패턴] 브릿지 패턴(Bridge Pattern) (0) | 2022.09.22 |
[디자인패턴] 전략패턴 (Strategy Pattern) (1) | 2022.09.21 |
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern) (2) | 2022.09.20 |