Decorator Pattern 란
객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴
기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합하여 사용하는 방식
구조
- Component
- ConcreteComponent 과 Decorator 가 구현할 인터페이스다.
두 객체를 동등하게 다루기 위해 존재함
- ConcreteComponent 과 Decorator 가 구현할 인터페이스다.
- ConcreteComponent
- 기능 추가를 받을 기본 객체
- Decorator
- 기능 추가를 할 객체는 이 객체를 상속받는다.
- ConcreteDecorator
- Decorator 를 상속받아 구현할 다양한 기능 객체이다.
이 기능들은 ConcreteComponent 에 추가되기 위해 만들어 진다.
- Decorator 를 상속받아 구현할 다양한 기능 객체이다.
구현
크리스마스 트리에 다양한 장식을 하고싶다고 해보자.
기본 크리스마스 트리가 있고, 장식으로는 깜빡이는 불이나, 꽃들을 생각해볼 수 있다.
Component
먼저 크리스마스 트리와 장식을 각각 추상화 해야할 것이다.
이들을 먼저 다음과 같은 인터페이스로 공통 추상화 하자.
public interface ChristmasTree {
String decorate();
}
ConcreteComponent
인터페이스를 상속 받아서 키 큰 나무와 키가 작은 나무를 구현
public class SmallChristmasTree implements ChristmasTree{
@Override
public String decorate() {
return "A small ChristmasTree";
}
}
public class TallChristmasTree implements ChristmasTree{
@Override
public String decorate() {
return "A tall ChristmasTree";
}
}
Decorator
트리 장식 추상화
public abstract class TreeDecorator implements ChristmasTree {
private ChristmasTree christmasTree;
public TreeDecorator(ChristmasTree christmasTree) {
this.christmasTree = christmasTree;
}
@Override
public String decorate() {
return christmasTree.decorate();
}
}
ConcreteDecorator
decorator를 상속받아서 장식을 구현
public class Lights extends TreeDecorator{
public Lights(ChristmasTree christmasTree) {
super(christmasTree);
}
public String decorateLights() {
return "with Lights";
}
@Override
public String decorate() {
return super.decorate() + decorateLights();
}
}
public class Flowers extends TreeDecorator{
public Flowers(ChristmasTree christmasTree) {
super(christmasTree);
}
public String decorateFlowers() {
return "with flowers";
}
@Override
public String decorate() {
return super.decorate() + decorateFlowers();
}
}
실행 & 결과
public class DecoratorPatternDemo {
public static void main(String[] args) {
ChristmasTree smallChristmasTree = new SmallChristmasTree();
System.out.println(smallChristmasTree.decorate());
ChristmasTree smallTreeWithLights = new Lights(smallChristmasTree);
System.out.println(smallTreeWithLights.decorate());
ChristmasTree tallChristmasTree = new TallChristmasTree();
System.out.println(tallChristmasTree.decorate());
ChristmasTree tallTreeWithLights = new Lights(tallChristmasTree);
System.out.println(tallTreeWithLights.decorate());
ChristmasTree tallTreeWithLightsAndFlowers = new Flowers(tallTreeWithLights);
System.out.println(tallTreeWithLightsAndFlowers.decorate());
}
}
Reference
'Design Pattern > 구조 패턴' 카테고리의 다른 글
Proxy pattern (0) | 2021.05.04 |
---|---|
Facade Pattern (0) | 2021.05.04 |
Composite Pattern (0) | 2021.05.04 |
Bridge Pattern (0) | 2021.05.04 |
Adapter pattern (0) | 2021.05.03 |