본문 바로가기

IT/디자인 패턴

[Design Pattern] 데코레이터 패턴 (Decorator Pattern)

1. 데코레이터 패턴이란?

기본 기능 객체와 부가 기능 객체를 결합해서 동적으로 기능을 확장할 수 있게 해주는 패턴

 

2. 데코레이터 패턴의 특징

1) 구조 패턴
클래스나 객체를 조합해서 더 큰 구조를 만드는 패턴

2) 합성 관계
생성자에서 필드의 객체를 생성하는 경우, 필드 객체의 라이프 사이클은 전체 객체에 의존적이게 된다.

 

3. 프록시 패턴과 데코레이터 패턴의 비교

프록시 패턴
제어의 흐름을 변경하거나 별도의 로직 처리를 목적으로한다. 특별한 경우가 아니라면 반환값을 변경하지 않는다.

데코레이터 패턴
데코레이터를 추가할수록 추상 메소드에 기능이 많아진다

 

4. 언제 사용하는가?

1) 기본 기능 객체의 기능을 그대로 유지하면서 새로운 기능을 동적으로 추가할 때 사용한다.

2) 탈부착 가능한 책임을 정의할 때 사용한다.

3) 상속을 통해 서브클래스를 만드는 방법이 비효율적 일 때 사용한다.

 

5. 예제 소스

public abstract class Window {

    abstract public void draw();
}

public class WindowConcrete extends Window {

    @Override
    public void draw() {
        System.out.println("draw Window");
    }
    
}
Window 추상 클래스와 구현체인 WindowConcrete 클래스를 생성한다. 
draw() 메소드에 데코레이터 클래스에서 구현한 부가기능이 추가된다.

 

public abstract class WindowDecorator extends Window {

    protected Window window;

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

public class ScrollBarDecorator extends WindowDecorator {

    public ScrollBarDecorator(Window window) {
        super(window);
    }

    //중요
    @Override
    public void draw() {
        super.window.draw();
        drawScrollBar();
    }

    private void drawScrollBar() {
        System.out.println("draw Scroll Bar");
    }

}

public class ButtonDecorator extends WindowDecorator {

    public ButtonDecorator(Window window) {
        super(window);
    }

    //중요
    @Override
    public void draw() {
        window.draw();
        drawButton();
    }

    private void drawButton() {
        System.out.println("draw Button");
    }

}
WindowDecorator 추상클래스를 상속받아서 부가 기능을 수행하는 Decorator 클래스를 생성한다.
생성자로 Window 추상 클래스의 구현체를 받고, 해당 구현체에 기능을 추가하는 형식으로 진행된다.

 

public class Main {

    public static void main(String[] args) {
        Window window = new ButtonDecorator(new ScrollBarDecorator(new WindowConcrete()));

        window.draw();
    }
}
WindowConcrete 구현체 클래스를 생성하고, ScrollBar와 Button Decorator를 추가한다.

 

출력

draw Window
draw Scroll Bar
draw Button

참조 :

gmlwjd9405.github.io/2018/07/09/decorator-pattern.html
johngrib.github.io/wiki/decorator-pattern/#fn:head
https://server-engineer.tistory.com/79?category=625272