데코레이터 패턴

데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.

 예 
 자바 
// the Window interface
interface Window {
 public void draw(); // draws the Window
 public String getDescription(); // returns a description of the Window
}

// implementation of a simple Window without any scrollbars
class SimpleWindow implements Window {
 public void draw() {
 // draw window
 }

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

아래의 클래스들은 모든 Window 클래스들의 데코레이터를 포함하고 있다.

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
 protected Window decoratedWindow; // the Window being decorated

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

// the first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
 public VerticalScrollBarDecorator (Window decoratedWindow) {
 super(decoratedWindow);
 }

 public void draw() {
 drawVerticalScrollBar();
 decoratedWindow.draw();
 }

 private void drawVerticalScrollBar() {
 // draw the vertical scrollbar
 }

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

// the second concrete decorator which adds horizontal scrollbar functionality
class HorizontalScrollBarDecorator extends WindowDecorator {
 public HorizontalScrollBarDecorator (Window decoratedWindow) {
 super(decoratedWindow);
 }

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

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

 public String getDescription() {
 return decoratedWindow.getDescription() + ", including horizontal scrollbars";
 }
}
Window 인스턴스를 만드는 테스트 프로그램은 아래와 같다.

public class DecoratedWindowTest {
 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());
 }
}

 C++ 

#include 

using namespace std;

/* Component (interface) */
class Widget {

public:
 virtual void draw() = 0;
 virtual ~Widget() {}
};

/* ConcreteComponent */
class TextField : public Widget {

private:
 int width, height;

public:
 TextField( int w, int h ){
 width = w;
 height = h;
 }

 void draw() {
 cout << "TextField: " << width << ", " << height << '\n';
 }
};

/* Decorator (interface) */
class Decorator : public Widget {

private:
 Widget* wid; // reference to Widget

public:
 Decorator( Widget* w ) {
 wid = w;
 }

 void draw() {
 wid->draw();
 }

 ~Decorator() {
 delete wid;
 }
};

/* ConcreteDecoratorA */
class BorderDecorator : public Decorator {

public:
 BorderDecorator( Widget* w ) : Decorator( w ) { }
 void draw() {
 Decorator::draw();
 cout << " BorderDecorator" << '\n';
 }
};

/* ConcreteDecoratorB */
class ScrollDecorator : public Decorator {
public:
 ScrollDecorator( Widget* w ) : Decorator( w ) { }
 void draw() {
 Decorator::draw();
 cout << " ScrollDecorator" << '\n';
 }
};

int main( void ) {

 Widget* aWidget = new BorderDecorator(
 new ScrollDecorator(
 new TextField( 80, 24 )));
 aWidget->draw();
 delete aWidget;
}

 같이 보기 
 컴포지트 패턴
 어댑터 패턴
 관점 지향 프로그래밍
 불변객체

 외부 링크 

 Decorator pattern description from the Portland Pattern Repository

분류:소프트웨어 디자인 패턴