1. 程式人生 > >設計模式學習(裝飾模式)

設計模式學習(裝飾模式)

一.設計意圖:

     動態的給一個物件新增一些額外的職責。

二.例子:

     我在這裡舉一個窗簾的例子。

     裝飾模式由抽象產品,具體產品,抽象裝飾,裝飾組成。

     1.首先我們先建立抽象產品類

         AbstractCurtain.h

class AbstractCurtain
{
public:
    AbstractCurtain();
    virtual ~AbstractCurtain();
    virtual int Cost() = 0;
};

       AbstractCuratin.cpp

AbstractCurtain::AbstractCurtain()
{

}

AbstractCurtain::~AbstractCurtain()
{

}

    2.然後我們建立具體的產品類

        WhiteCuratin.h

class WhiteCurtain : public AbstractCurtain
{
public:
    WhiteCurtain();
    ~WhiteCurtain();
    int Cost();
};

       WhiteCuratin.cpp

WhiteCurtain::WhiteCurtain()
{
}

WhiteCurtain::~WhiteCurtain()
{

}

int WhiteCurtain::Cost()
{
    return 1;
}

   3.建立抽象裝飾類

       Decorator.h

class Decorator : public AbstractCurtain
{
public:
    Decorator(AbstractCurtain* abstractCurtain);
    ~Decorator();
    int Cost();
protected:
    AbstractCurtain* abstractCurtain;
};

      Decorator.cpp

Decorator::Decorator(AbstractCurtain *abstractCurtain)
{
    this->abstractCurtain = abstractCurtain;
}

Decorator::~Decorator()
{

}

int Decorator::Cost()
{
    return abstractCurtain->Cost();
}

    4.建立具體的裝飾類

       OtherColor.h

class OtherColor : public Decorator
{
public:
    OtherColor(AbstractCurtain* abstractCurtain);
    ~OtherColor();
    int Cost();
};

     OtherColor.cpp

OtherColor::OtherColor(AbstractCurtain* abstractCurtain):Decorator(abstractCurtain)
{
    this->abstractCurtain = abstractCurtain;
}

OtherColor::~OtherColor()
{

}

int OtherColor::Cost()
{
    return this->abstractCurtain->Cost() + 1;
}

    OtherPattern.h

class OtherPattern : public Decorator
{
public:
    OtherPattern(AbstractCurtain* abstractCurtain);
    ~OtherPattern();
    int Cost();
};

   OtherPattern.cpp

OtherPattern::OtherPattern(AbstractCurtain *abstractCurtain):Decorator(abstractCurtain)
{
    this->abstractCurtain = abstractCurtain;
}

OtherPattern::~OtherPattern()
{

}

int OtherPattern::Cost()
{
    return this->abstractCurtain->Cost() + 1;
}

   最後我們來使用這個模式

int main()
{
    qDebug() <<  OtherColor(new OtherPattern(new WhiteCurtain())).Cost() << endl;
    return 0;
}

得到的結果

3 

三.結論:

     裝飾模式其實用的是遞迴,他修改的是“外觀”,並不修改產品的內在,所以當產品原本就很龐大時,使用裝飾模式代價太高。 

     優點:1.在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。

                 2.比靜態繼承更靈活

                 3.避免在層次結構高層的類有太多的特徵

     缺點:會有許多的小物件。

四.應用場景

     需要動態的在不影響其他物件的情況下。

     處理那些可以撤銷的職責。