您的位置:首页 > 其它

设计模式之装饰模式Decorator

2017-09-26 10:16 267 查看
动态地给一个对象扩展功能,而不是通过子类继承。

代码示例:

//The Window interface class
class Window
{
public:
//Draws the Window
virtual void draw() = 0;
//Returns a description of the Window
virtual string getDescription() = 0;
};

//Implementation of a simple Window without any scrollbars
class SimpleWindow : public Window
{
public:
virtual void draw() override
{
//Draw window
}

virtual string getDescription() override
{
return "simple window";
}
};

//abstract decorator class - note that it implements window
class WindowDecorator : public Window
{
protected:
Window* _windowToBeDecorated; //the window being decorated

public:
WindowDecorator(Window* windowToBeDecorated)
{
_windowToBeDecorated = windowToBeDecorated;
}

virtual void draw() override
{
_windowToBeDecorated->draw(); //Delegation
}

virtual string getDescription() override
{
return _windowToBeDecorated->getDescription(); //Delegation
}

};

//The first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator : public WindowDecorator
{
public:
VerticalScrollBarDecorator(Window* windowToBeDecorated)
: WindowDecorator(windowToBeDecorated)
{}

virtual void draw() override
{
WindowDecorator::draw();
drawVerticalScrollBar();
}

virtual string getDescription()
{
return WindowDecorator::getDescription() + ", including vertical scrollbars";
}

private:
void drawVerticalScrollBar()
{
//Draw the vertical scrollbar
}
};

//The second concrete decorator which adds horizontal scrollbar functionality
class HorizontalScrollBarDecorator : public WindowDecorator
{
public:
HorizontalScrollBarDecorator(Window* windowToBeDecorated)
: WindowDecorator(windowToBeDecorated)
{}

virtual void draw() override
{
WindowDecorator::draw();
drawHorizontalScrollBar();
}

virtual string getDescription()
{
return WindowDecorator::getDescription() + ", including horizontal scrollbars";
}

private:
void drawHorizontalScrollBar()
{
//Draw the horizontal scrollbar
}
};

void main()
{
//create a decorated window with horizontal and vertical scrollbars.
Window* decoratedWindow = new HorizontalScrollBarDecorator(new VerticalScrollBarDecorator(new SimpleWindow));

//Print the window's description
decoratedWindow->getDescription();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  装饰 Decorator