JAVA/DesignPattern

Design Pattern 디자인 패턴 Decorator Pattern 데코레이터 패턴

호두밥 2021. 12. 18. 21:47

Decorator Pattern 데코레이터 패턴

구조 패턴으로, 행동을 가진 객체를 둘러싸는 특별한 래퍼(Wrapper)를 통해 객체에 새로운 행동을 추가할 수 있도록 해주는 패턴입니다.

장단점

장점

  • 서브클래스를 새로 만들지 않도고 새로운 메소드를 추가할 수 있습니다.
  • 런타임에 객체에 대한 책임을 추가하고 삭제할 수 있습니다.
  • 여러 개의 메소드를 합칠 수 있습니다.
  • (단일책임원칙) 다양한 동작을 가진 단일 클래스를 여러개의 서브 클래스로 분리할 수 있습니다. 

단점

  • Decorator가 중첩(스택 구조)되어 있는 경우,  Decorator 하나를 삭제하기 어렵습니다.
  • Decorator가 순서 없이 중첩되어 있는 경우, Decorator 하나를 추가하기 어렵습니다.
  • 여러 층의 초기 구성 코드가 보기 좋지 않을 수 있습니다.

Decorator Pattern 데코레이터 패턴 구현

도형 Interface

public interface 도형 {
    void 그리기();
}

세모(Class)

public class 세모 implements 도형{
    @Override
    public void 그리기() {
        System.out.println("세모");
    }
}

동그라미(Class)

public class 동그라미 implements 도형 {
    @Override
    public void 그리기() {
        System.out.println("동그라미");
    }
}

도형그리기 (Decorator, Class)

public class 도형그리기 implements 도형 {

    protected 도형 도형;

    public 도형그리기(도형 도형) {
        this.도형 = 도형;
    }

    @Override
    public void 그리기() {
        도형.그리기();
    }
}

도형꾸미기(Decorator, Class)

public class 도형꾸미기 extends 도형그리기{

    public 도형꾸미기(도형 도형) {
        super(도형);
    }

    @Override
    public void 그리기() {
        super.그리기();
        색칠하기();
    }

    private void 색칠하기() {
        System.out.println("색칠하기");
    }
}

Main

public class Main {
    public static void main(String[] args) {
        도형꾸미기 도형 = new 도형꾸미기(new 세모());
        도형.그리기();
    }

}
세모
색칠하기

 

참조