데코레이터 패턴
위키백과, 우리 모두의 백과사전.
데코레이터 패턴(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; }
[편집]C#
namespace GSL_Decorator_pattern { interface IWindowObject { void draw(); // draws the object String getDescription(); // returns a description of the object } class ControlComponent : IWindowObject { public ControlComponent() { } public void draw() // draws the object { Console.WriteLine( "ControlComponent::draw()" ); } public String getDescription() // returns a description of the object { return "ControlComponent::getDescription()"; } } abstract class Decorator : IWindowObject { protected IWindowObject _decoratedWindow = null; // the object being decorated public Decorator( IWindowObject decoratedWindow ) { _decoratedWindow = decoratedWindow; } public virtual void draw() { _decoratedWindow.draw(); Console.WriteLine("\tDecorator::draw() "); } public virtual String getDescription() // returns a description of the object { return _decoratedWindow.getDescription() + "\n\t" + "Decorator::getDescription() "; } } // the first decorator class DecorationA : Decorator { public DecorationA(IWindowObject decoratedWindow) : base(decoratedWindow) { } public override void draw() { base.draw(); DecorationAStuff(); } private void DecorationAStuff() { Console.WriteLine("\t\tdoing DecorationA things"); } public override String getDescription() { return base.getDescription() + "\n\t\tincluding " + this.ToString(); } }// end class ConcreteDecoratorA : Decorator class DecorationB : Decorator { public DecorationB(IWindowObject decoratedWindow) : base(decoratedWindow) { } public override void draw() { base.draw(); DecorationBStuff(); } private void DecorationBStuff() { Console.WriteLine("\t\tdoing DecorationB things"); } public override String getDescription() { return base.getDescription() + "\n\t\tincluding " + this.ToString(); } }// end class DecorationB : Decorator class DecorationC : Decorator { public DecorationC(IWindowObject decoratedWindow) : base(decoratedWindow) { } public override void draw() { base.draw(); DecorationCStuff(); } private void DecorationCStuff() { Console.WriteLine("\t\tdoing DecorationC things"); } public override String getDescription() { return base.getDescription() + "\n\t\tincluding " + this.ToString(); } }// end class DecorationC : Decorator }// end of namespace GSL_Decorator_pattern
[편집]파이썬
class Coffee: def cost(self): return 1 class Milk: def __init__(self, coffee): self.coffee = coffee def cost(self): return self.coffee.cost() + .5 class Whip: def __init__(self, coffee): self.coffee = coffee def cost(self): return self.coffee.cost() + .7 class Sprinkles: def __init__(self, coffee): self.coffee = coffee def cost(self): return self.coffee.cost() + .2 # Example 1 coffee = Milk(Coffee()) print "Coffee with milk : "+str(coffee.cost()) # Example 2 coffee = Whip(Milk(Sprinkles(Coffee()))) print "Coffee with milk, whip and sprinkles : "+str(coffee.cost())
[편집]자바스크립트
//Class to be decorated function Coffee(){ this.cost = function(){ return 1; }; } //Decorator A function Milk(coffee){ this.cost = function(){ return coffee.cost() + 0.5; }; } //Decorator B function Whip(coffee){ this.cost = function(){ return coffee.cost() + 0.7; }; } //Decorator C function Sprinkles(coffee){ this.cost = function(){ return coffee.cost() + 0.2; }; } //Here's one way of using it var coffee = new Milk(new Whip(new Sprinkles(new Coffee()))); alert( coffee.cost() ); //Here's another var coffee = new Coffee(); coffee = new Sprinkles(coffee); coffee = new Whip(coffee); coffee = new Milk(coffee); alert(coffee.cost());
출처 위키 피디아
http://ko.wikipedia.org/wiki/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0_%ED%8C%A8%ED%84%B4
'javascript' 카테고리의 다른 글
끄적끄적 jquery prototye 으로 팝업 호출방식 비슷하게 만들어봄 (0) | 2017.01.26 |
---|---|
CSS 셀렉터 (0) | 2015.03.02 |
[위키]팩토리 메서드 패턴 (0) | 2012.12.27 |
[Javascript] IOS WebView Ajax return page call init funtion issue (0) | 2012.09.19 |
JavaScript-Garden 한글 (0) | 2012.08.17 |