现在的位置: 首页 > 综合 > 正文

decorator 装饰模式

2013年03月19日 ⁄ 综合 ⁄ 共 2277字 ⁄ 字号 评论关闭
#include <iostream>
#include <string>
using namespace std;

class Component
{
public:
    virtual ~Component(){}
    virtual void Operation(){}
protected:
    Component(){};
};

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

class Decorator : public Component
{
public:
    Decorator(Component *compoent)
        : m_pComponent(compoent)
    {
    }
    ~Decorator(){delete m_pComponent;}
    void Operation()
    {
    }
protected:
    Component *m_pComponent;  // 被装饰对象的指针
};

class ConcreteDecorator : public Decorator
{
public:
    ConcreteDecorator(Component *com)
        : Decorator(com)
    {
    }
    ~ConcreteDecorator(){}
    void Operation()
    {
        m_pComponent->Operation(); // 调用被装饰对象的方法
        AddedBehavior();           // 调用添加的动作
    }
    void AddedBehavior()
    {
        cout<<"ConcreteDecorator::AddedBehavior()"<<endl;
    }
};

class ConcreteDecoratorB : public Decorator
{
public:
    ConcreteDecoratorB(Component *com)
        : Decorator(com)
    {
    }
    ~ConcreteDecoratorB(){}
    void Operation()
    {
        m_pComponent->Operation(); // 调用被装饰对象的方法
        AddedBehavior();           // 调用添加的动作
    }
    void AddedBehavior()
    {
        cout<<"ConcreteDecoratorB::AddedBehavior()"<<endl;
    }
};

int main()
{
    //ConcreteDecorator给 ConcreteComponent类添加了动作 AddedBehavior。
    Component *com = new ConcreteComponent();
    Decorator *dec = new ConcreteDecorator(com);
    Decorator *decB = new ConcreteDecoratorB(dec);
    decB->Operation();
    delete decB;
    return 0;
}

///////////////////////////////////////////
#include <iostream>
#include <string>
using namespace std;

class Component
{
public:
    virtual void show() = 0;
    virtual ~Component(){cout<<"~Component"<<endl;}
};

class Person : public Component
{
public:
    Person(){}
    ~Person(){cout <<"~Person"<< endl;}
    Person(string name)
    {
        this->name = name;
    }
    virtual void show()
    {
        cout<<"装扮的{0}"<<name<<endl;
    }
private:
    string name;
};

class Decorator: public Component
{
public:
    Decorator(Component *com):component(com){}
    ~Decorator()
    { 
        if (component != NULL) 
            delete component; 
        cout<<"~Decorator"<<endl;
    }
    void show()
    {
    }
protected:
    Component *component;
};

class Finery : public Decorator
{
public:
    Finery(Component *com):Decorator(com){}
    ~Finery()
    {
        cout<<"~Finery"<<endl;
    }
    void show()
    {
        component->show();
        cout<<"Finery";    
    }
};
 
class TShirts : public Decorator
{
public:
    TShirts(Component *com):Decorator(com){}
    ~TShirts()
    {
        cout<<"~TShirts"<<endl;
    }
    void show()
    {
        component->show();
        cout<<"大T恤 \n";
    }
};
 
int main()
{
    Person * person = new Person("xiao hong");
    Decorator *finery = new Finery(person);
    Decorator *tshirt = new TShirts(finery);
    tshirt->show();
    delete tshirt;
    return 0;
}

抱歉!评论已关闭.