디자인 패턴 - 데코레이터 패턴(Design pattern - Decorator pattern)

정의 - 주어진 상황 및 용도에 따라 객체에 추가적인 책임을 덧붙이는 패턴. 서브클래스를 통해 기능을 유연하게 확장하는 방법을 제공한다.

 상속을 통해 구성요소의 형식을 맞춰서 감싸 사용하는 일종의 래퍼(Wrapper).
 기존의 컴포넌트에 원래 있던 메소드를 호출하기 전, 또는 후에 데코레이터에서 별도의 작업을 처리하는 방식으로 기능을 추가한다.
 데코레이터의 형식은 그 데코레이터로 감싸는 객체의 형식과 같다. 상속을 이용해서 형식을 맞추는 것. 인스턴스로 본래 컴포넌트를 가지고 있고, 또 그 자신도 컴포넌트와 같은 형식이므로 다른 데코레이터로 감쌀 수도 있다.

Component, Decorator : Component
ConcreteComponent : Component를 객체로써 사용. 이를 ConcreteDecorator : Decorator로 장식 가능. ConcreteDecorator는 Component 형식이므로 또 다른 Decorator로 장식 가능.

예시 :
Component c = new OtherDecorator(new SomeDecorator(new ConcreteComponent));
c.Do();
//ConcreteComponent.Do() -> SomeDecorator.Do() -> OtherDecorator.Do() 순서로 호출.

 기존 컴포넌트의 메소드가 A를 출력한다고 했을 때, 데코레이터로 감싸서 기존 컴포넌트의 함수를 호출한 뒤, B를 출력하게끔 한다. 그러면 컴포넌트 형식으로 해당 객체를 불러서 메소드를 실행 했을 때에, AB가 출력될 것이다. 계속 덧붙여서 ABCDEF 이런 식으로 행동을 추가할 수도 있다. 형식은 어디까지나 기존 컴포넌트 형식이다.
 자바의 I/O가 데코레이터 패턴으로 구현되어 있다. FileInputStream으로 파일을 하나씩 읽고, BufferedInputStream으로 FileInputStream에서 읽은 내용을 버퍼링하는 식이다.


댓글

이 블로그의 인기 게시물

디자인 패턴 - 더티 플래그(Dirty flag)

디자인 패턴 - 서비스 중개자 패턴(Service locator pattern)

인공지능 - 유한 상태 기계(Finite state machine)