設計模式之裝飾模式(Decorator)

裝飾模式是一種經典的類功能擴展模式,其精髓在裝飾類使用繼承加聚合的方式得到接口和要實現對象,而後經過本身實現擴展接口code

做用

裝飾模式經過裝飾類動態地將責任附加到對象上,若要擴展功能,無需經過繼承增長子類就能擴展對象的新功能,提供了比繼承更有彈性的替代方案,避免了子類數量膨脹帶來的系統臃腫。對象

類視圖

代碼實現

class Component
{
public:
    Component(){}
    virtual ~Component(){}

    virtual void operation() = 0;
};


class ConcreteComponentA : public Component
{
public:
    ConcreteComponentA(){}
    ~ConcreteComponentA(){}

    void operation()
    {
        fprintf(stderr, "ConcreteComponentA's operation!\n");
    }
};

class ConcreteComponentB : public Component
{
public:
    ConcreteComponentB(){}
    ~ConcreteComponentB(){}

    void operation()
    {
        fprintf(stderr, "ConcreteComponentB's operation!\n");
    }
};

class Decorator : public Component
{
public:
    Decorator() :mComponent(NULL){}
    virtual ~Decorator(){}

    virtual void operation()
    {
        if (mComponent)
            mComponent->operation();
    }
    virtual void setComponent(Component* pComponent)
    {
        mComponent = pComponent;
    }

protected:
    Component* mComponent;
};


class ConcreteDecoratorE : public Decorator
{
public:
    ConcreteDecoratorE ();
    virtual ~ConcreteDecoratorE ();

    virtual void addBehavior()
    {
        mComponent->operation();
        fprintf(stderr, "ConcreteDecoratorE's addBehavior!\n");
    }
};

class ConcreteDecoratorF : public Decorator
{
public:
    ConcreteDecoratorF ();
    virtual ~ConcreteDecoratorF ();

    virtual void addBehavior()
    {
        operation();
        fprintf(stderr, "ConcreteDecoratorF's addBehavior!\n");
    }
};



int main()
{
    ConcreteComponentB *pComponent = new ConcreteComponentB();
    ConcreteDecoratorF decorator;
    decorator.setComponent(pComponent);
    decorator.addBehavior();
}
相關文章
相關標籤/搜索