大豆

导航

C++设计模式-decorator

1 适用性
\• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加一些职责,如:加密层,解密层。
• 处理那些可能偶尔才会用到的特性接口
• 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持
每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
#include "stdafx.h"
#include 
<iostream>
using namespace std;


class Component            //被装饰者抽象类
{
public:
    
virtual void Draw() = 0;
};
class Decorator : public Component //被装饰者基类
{
public:
    Decorator(Component 
*c) : _component(c){}
    
~Decorator() {delete _component;}

    
virtual void Draw() { if (_component) _component->Draw();}
private:
    Component 
*_component;
};
//////////////////////////////////////////////////////////////////////////
class MyComponent : public Component //被装饰者
{
public:
    
virtual void Draw() {cout << "MyComponent::Draw()" << endl;}
};
//////////////////////////////////////////////////////////////////////////
class BorderDecorator : public Decorator //边框装饰
{
public:
    BorderDecorator(Component 
*c) : Decorator(c){}
    
virtual void Draw()
    {
        cout 
<< "DrawBorder" << endl;
        Decorator::Draw();
    }
};
class ScrollDecorator : public Decorator //滚动条装饰
{
public:
    ScrollDecorator(Component 
*c) : Decorator(c){}
    
virtual void Draw()
    {
        cout 
<< "DrawSrollbar" << endl;
        Decorator::Draw();
    }
};
int main()
{
    Component 
*c2 = new BorderDecorator(
        
new MyComponent()); //装饰边框的组件
    c2->Draw();
    delete c2;

    Component 
*c3 = new ScrollDecorator(
        
new BorderDecorator(
        
new MyComponent())); //同时装饰上边框和滚动条的组件
    c2->Draw();
    delete c3;

    system(
"pause");
    
return 0;
}

posted on 2010-03-19 10:42  大豆  阅读(213)  评论(1)    收藏  举报