Decorator Pattern

개념
- 객체에 장식을 해가는 패턴

I. 의도

     상속없이 객체에 동적으로 새로운 서비스를 추가할 수 있게 한다.

데코레이터를 사용하면 서브 클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할 수 있다

정의: 객체에 장식을 해가는 패턴

     객체에 추가 요소를 동적으로 더할 수 있다.                                                                  

II. 활용

  • 동적으로/ 투명하게 객체에 새로운 서비스를 추가할 때, 다른 객체에 어떠한 영향도 주지 않게 된다
  • 제거될 수 있는 서비스일 때

III. 결과

  • 단순 상속보다 설계의 융통성 증대
  • 데코레이터와 해당 컴포넌트는 동일한 것이 아니다. 데코레이터는 클라이언트에게 일관된 인터페이스를 제공하는 껍데기이다.

관련 패턴: Adpater는 인터페이스스를 변경시켜 주지만 Decorator는 객체의 책임과 행위를 변화시킨다

Decorator는 한 컴포넌트만을 갖는 Composite로 볼 수 있으나, decorator의 목적은 객체의 합성이 아니라 객체에 새로운 행위를 추가하기 위한 것이다

Strategy는 객체의 내부를 변화시키나 Decorator는 객체의 겉모양을 변경시킨다.

데코레이터를 사용함으로써 작은 규모의 객체들이 많이 생성된다.

 

 

참여자

역할

Component

동적으로 추가할 서비스를 가질 가능성이 있는 객체들에 대한 인터페이스

ConcreteComponent

추가적인 서비스가 실제로 정의되어야 할 필요가 있는 객체

Decorator

Component 객체에 대한 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의

ConcreteDecorator

Component에 새롭게 추가할 서비스를 실제로 구현하는 클래스

 

상위클래스(Decorator)와 하위 클래스(ConcreteDecorator)의 관계

가. 하위 클래스는 상위클래스의 형식을 멤버변수로 가짐.

1) ChildDecorator 는 Decorator를 멤버변수로 받음

2)일반적으로 생성자의 인자로 받아서 멤버변수로 셋팅되며. 별도의 setter를 가지는 경우는 거의 없음.

나. 하위 클래스는 상위클래스를 상속 받아 상위클래스의 메소드 이용.

1)하위 클래스의 getMerong() 이라는 메소드는 상위 클래스의 getMerong()을 오버라이드하지만, 내부적으로 상위클래스의 getMerong()을 사용

다. Sample Code

-------------- 데코레이터 -------------
package ch08_Decorator;
public class Decorator {
    public String getMerong(){
     return "merong";
    }
}

-------------- 데코레이터를 상속 받음 ----
package ch08_Decorator;
public class ChildDecorator extends Decorator{
   private Decorator decorator;
    public ChildDecorator(Decorator decorator){
      this.decorator = decorator;
    }


    @Override
    public String getMerong(){
      return "@" + decorator.getMerong() + "@";
    }
}

-------------- 테스트 클래스 --------------
package ch08_Decorator;
public class Test {
    public static void main(String[] args) {
      Decorator decorator = new Decorator();
      System.out.println(decorator.getMerong());
      Decorator child = new ChildDecorator(decorator);
      System.out.println(child.getMerong());
      Decorator child2 = new ChildDecorator(child);
      System.out.println(child2.getMerong());
    }
}
-------------- 결과 -----------------
merong
@merong@
@@merong@@

댓글