设计模式一日一练:装饰者模式(Decorator)

来源:互联网 发布:李善兰 知乎 编辑:程序博客网 时间:2024/04/30 07:33

    Decorator模式,动态地给一个对象添加一些额外的职责。

// 控件抽象基类class Widget {    public:        Widget();        virtual void Draw();}// 具体的控件--窗口class Window : public Widget {    public:        Window();        virtual void Draw();}// 控件的装饰者class Decorator : public Widget {    public:        Decorator(Widget*);        virtual void Draw();            private:        Widget* widget;}Decorator::Decorator(Widget* w) {    this->widget = w;}void Decorator::Draw() {    this->widget->Draw();}// 装饰者的子类,给控件添加边框效果class BorderDecorator : public Decorator {    public:        BorderDecorator(Widget*, int borderWidth);        virtual void Draw();            private:        void DrawBorder();            private:        Widget* widget;        int width;}BorderDecorator::BorderDecorator(Widget* widget, int borderWidth) {    this->widget = widget;    this->width = borderWidth;}void BorderDecorator::Draw() {    this->widget->Draw();    this->DrawBorder();}// 装饰者的子类,给控件添加滚动条class ScrollDecorator : public Decorator {    public:        ScrollDecorator(Widget*);        virtual void Draw();            private:        void DrawScrollBar();            private:        Widget* widget;}ScrollDecorator::ScrollDecorator(Widget* widget) {    this->widget = widget;}void ScrollDecorator::Draw() {    this->widget->Draw();    this->DrawScrollBar();}void Test() {    Widget* window = new Window();    Widget* windowWithScroll = new ScrollDecorator(window); // 带滚动条的window    Widget* windowWithScrollAndBorder = new BorderDecorator(windowWithScroll, 1);// 带滚动条和边框的window    windowWithScrollAndBorder->Draw();    // destroy ...}

    PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。

15 0
原创粉丝点击