設計模式學習(裝飾模式)
阿新 • • 發佈:2018-12-20
一.設計意圖:
動態的給一個物件新增一些額外的職責。
二.例子:
我在這裡舉一個窗簾的例子。
裝飾模式由抽象產品,具體產品,抽象裝飾,裝飾組成。
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.避免在層次結構高層的類有太多的特徵
缺點:會有許多的小物件。
四.應用場景
需要動態的在不影響其他物件的情況下。
處理那些可以撤銷的職責。