#include <iostream>
using namespace std;

/*
  装饰模式是为已有功能动态添加更多功能的方法
  装饰类和组件类的关系,装饰类为组件类添加功能,组件类
  是装饰类的一个成员。这样可以在程序运行时动态的增删功
  能,但是每一个装饰类不方便单独调试
  使用装饰模式,可以达到串行化处理的效果
*/

class Component {
public:
    virtual void Show() = 0;
};

class ConcreteComponent : public Component {
public:
    void Show() {
        cout<<"ConcreteComponent Show"<<endl;
    }
};

class Decorator : public Component {
protected:
    Component* m_pComponent;

public:
    void Show() {
        if (m_pComponent != NULL) {
            m_pComponent->Show();
        }
    }
};

class ConcreteDecoratorA : public Decorator {
public:
    void SetComponent(Component* pComponent) {
        m_pComponent = pComponent;
    }

    void Show() {
        cout<<"ConcreteDecoratorA Show"<<endl;
        m_pComponent->Show();
    }
};

class ConcreteDecoratorB : public Decorator {
public:
    void SetComponent(Component* pComponent) {
        m_pComponent = pComponent;
    }

    void Show() {
        cout<<"ConcreteDecoratorB Show"<<endl;
        m_pComponent->Show();
    }
};

int main()
{
    ConcreteComponent c;
    ConcreteDecoratorA d1;
    ConcreteDecoratorB d2;

    d1.SetComponent(&c);
    d2.SetComponent(&d1);
    d2.Show();

    return 0;
}

 posted on 2012-08-05 10:34  晴朗蝈蝈  阅读(124)  评论(0编辑  收藏  举报