[ 목차 ]
안녕하세요. 오늘은 JAVA 디자인패턴 중 데코레이터(Decorator) 패턴에 대해서 알아보겠습니다.
1. 데코레이터(Decorator) 패턴 이란?
데코레이터 패턴은 기존 객체에 동적으로 새로운 기능을 추가하거나 변경할 수 있는 구조적 디자인 패턴입니다. 이 패턴은 기존 클래스를 수정하지 않고 객체의 확장성을 개선하기 위해 사용되며, 객체 합성을 통해 런타임 중에 객체의 행동을 변경할 수 있습니다.
### 2. 데코레이터(Decorator) 패턴 구현 방법
데코레이터 패턴을 구현하기 위한 주요 구성 요소는 다음과 같습니다:
- Component(기본 기능) 인터페이스: 객체의 기본 동작을 정의합니다.
- ConcreteComponent(구체적 기본 기능) 클래스: Component 인터페이스를 구현하는 기본 기능을 제공하는 실제 클래스입니다.
- Decorator 클래스: Component 인터페이스와 동일한 인터페이스를 가진 데코레이터 클래스로, ConcreteComponent 객체를 감싸며, 동일한 기능을 가지면서 추가적인 기능을 적용할 수 있는 클래스입니다.
- ConcreteDecorator 클래스: Decorator 클래스를 상속받아 동적 기능을 추가하거나 변경할 실제 구현 클래스입니다.
// Component 인터페이스
public interface Coffee {
String getDescription();
double cost();
}
// ConcreteComponent 클래스
public class BasicCoffee implements Coffee {
public String getDescription() {
return "Basic Coffee";
}
public double cost() {
return 1.00;
}
}
// Decorator 클래스
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
public String getDescription() {
return decoratedCoffee.getDescription();
}
public double cost() {
return decoratedCoffee.cost();
}
}
// ConcreteDecorator 클래스
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
public String getDescription() {
return super.getDescription() + ", with Milk";
}
public double cost() {
return super.cost() + 0.50;
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
// 기본 커피 생성
Coffee basicCoffee = new BasicCoffee();
System.out.println(basicCoffee.getDescription() + ": $" + basicCoffee.cost());
// 데코레이터를 사용해 커피에 우유 추가
Coffee coffeeWithMilk = new MilkDecorator(basicCoffee);
System.out.println(coffeeWithMilk.getDescription() + ": $" + coffeeWithMilk.cost());
}
}
3. 데코레이터(Decorator) 패턴의 장단점
3.1. 장점
- 기존 코드를 수정하지 않고 동적으로 객체의 기능을 확장하거나 변경할 수 있습니다.
- 클래스 상속보다 유연하게 객체를 조합하여 필요한 기능을 구성할 수 있습니다.
- 객체의 책임을 확장하는데 수평적(structural) 접근이 가능합니다.
3.2. 단점
- 많은 데코레이터 객체를 관리해야 할 때 코드의 복잡도가 증가할 수 있습니다.
- 데코레이터 체인이 길어질수록 디버깅과 유지보수가 어려워질 수 있습니다.
4. 데코레이터(Decorator) 패턴의 활용 예
데코레이터 패턴은 다양한 활용 사례가 있습니다.
- 윈도우 시스템에서의 GUI 구성요소: 버튼, 텍스트 박스 등의 기본 구성요소에 스크롤 바, 테두리, 그림자 등의 데코레이터를 동적으로 추가할 수 있습니다.
- 요금제 시스템: 기본 요금제에 추가 옵션을 동적으로 추가해 결제 금액을 계산할 수 있습니다.
- Java I/O API에서의 InputStream, OutputStream: 버퍼링, 암호화 등의 기능을 필요한 시점에 데코레이터를 통해 객체에 추가하여 사용할 수 있습니다.
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴
2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴
2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴
'JAVA' 카테고리의 다른 글
JAVA 디자인 패턴 - 커맨드(Command) 패턴 (0) | 2023.07.14 |
---|---|
JAVA 디자인패턴 - 프록시(Proxy) 패턴 (0) | 2023.07.14 |
JAVA 디자인패턴 - 옵저버(Observer) 패턴 (0) | 2023.07.13 |
JAVA 디자인패턴 - 비지터(Visitor) 패턴의 정의, 장점, 구현 (0) | 2023.07.12 |
JAVA 디자인패턴 - 이터레이터(Iterator) 패턴의 정의, 사용 이유, 구현방법 (0) | 2023.07.12 |
댓글