데코레이터 패턴

데코레이터 패턴(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 <iostream>  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; } 

같이 보기

[편집]

외부 링크

[편집]