데코레이터 패턴


데코레이터는 우리 말로 '장식'이다. 이름 그대로 그러한 장식(기능)들을 쉽게 추가할 수 있도록 돕는 패턴을 말한다.

 

Window에 대해 이야기해보자. (여기서 Window는 화면을 말한다. GUI 해본 사람이라면 알겠지??)

Window 인터페이스를 정의하자. 기능은 2가지만 나타냈다.

public interface Window {

    void draw(); // draws the Window
    String getDescription(); // returns a description of the Window
}

 

위의 인터페이스의 구현체 하나를 만들자.

public class SimpleWindow implements Window {

    @Override
    public void draw() {
        // draw window
    }

    @Override
    public String getDescription() {
        return "simple window";
    }
}

 

자, 이제 Window 인터페이스를 구현한 추상 클래스를 만든다. 이 추상 클래스로 인해 기능을 유연하게 추가할 수 있다.

abstract class WindowDecorator implements Window {

    protected Window decoratedWindow; // the Window being decorated

    public WindowDecorator (Window decoratedWindow) {
        this.decoratedWindow = decoratedWindow;
    }
}

 

위의 추상 클래스를 상속받아 디테일한 기능을 구현한다. 보면 생성자에 추상 클래스의 생성자로 위임하는걸 볼 수 있다.

public class HorizontalScrollBarDecorator extends WindowDecorator {

    public HorizontalScrollBarDecorator (Window decoratedWindow) {
        super(decoratedWindow);
    }

    @Override
    public void draw() {
        drawHorizontalScrollBar();
        decoratedWindow.draw();
    }

    private void drawHorizontalScrollBar() {
        // draw the horizontal scrollbar
    }

    @Override
    public String getDescription() {
        return decoratedWindow.getDescription() + ", including horizontal scrollbars";
    }
}

 

Main Entry에서 사용하는 코드

public class Main {

    public static void main(String[] args) {
        // create a decorated Window with horizontal and vertical scrollbars
        Window decoratedWindow = new HorizontalScrollBarDecorator(
                new VerticalScrollBarDecorator(new SimpleWindow()));

        // print the Window's description
        System.out.println(decoratedWindow.getDescription());
    }
}