Design Pattern/구조 패턴

Decorator Pattern

Decorator Pattern 란

객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴

기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합하여 사용하는 방식

구조

  • Component
    • ConcreteComponent 과 Decorator 가 구현할 인터페이스다.
      두 객체를 동등하게 다루기 위해 존재함
  • ConcreteComponent
    • 기능 추가를 받을 기본 객체
  • Decorator
    • 기능 추가를 할 객체는 이 객체를 상속받는다.
  • ConcreteDecorator
    • Decorator 를 상속받아 구현할 다양한 기능 객체이다.
      이 기능들은 ConcreteComponent 에 추가되기 위해 만들어 진다.

구현

크리스마스 트리에 다양한 장식을 하고싶다고 해보자.
기본 크리스마스 트리가 있고, 장식으로는 깜빡이는 불이나, 꽃들을 생각해볼 수 있다.

 

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

dailyheumsi.tistory.com/198

'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