目錄
1、裝飾器模式(Decorator Pattern)含義
2、裝飾器模式的UML圖學(xué)習(xí)
3、裝飾器模式的應(yīng)用場(chǎng)景
4、裝飾器模式的優(yōu)缺點(diǎn)
5、C++實(shí)現(xiàn)裝飾器模式的簡(jiǎn)單實(shí)例
1、裝飾器模式(Decorator Pattern)含義
裝飾模式(Decorator),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外地職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活【DP】
裝飾模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地向?qū)ο筇砑宇~外的功能。
裝飾模式通過將對(duì)象包裝在裝飾器類中,實(shí)現(xiàn)了透明地?cái)U(kuò)展對(duì)象的能力。
2、裝飾器模式的UML圖學(xué)習(xí)
?組成元素:
(1)Component是定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé);
(2)ConcreteComponent是定義了一個(gè)具體地對(duì)象,也可以給這個(gè)對(duì)象添加一些職責(zé);
(3)Decorator,裝飾抽象類,繼承了Component,從外類來擴(kuò)展Component類的功能,但對(duì)于Component來說,是無需知道Decorator的存在的。至于ConcreteDecorator就是具體的裝飾對(duì)象,起到給Component添加職責(zé)的功能【DPE】
3、裝飾器模式的應(yīng)用場(chǎng)景
(1)IO流操作:在IO流中,可以使用裝飾器模式來添加緩沖、加密、壓縮等功能,而無需修改原始的IO類。
(2)GUI組件:在圖形用戶界面中,可以使用裝飾器模式來為組件添加邊框、滾動(dòng)條、陰影等外觀效果。
(3)日志記錄:可以使用裝飾器模式來為日志記錄器添加時(shí)間戳、日志級(jí)別等額外信息。
(4)權(quán)限控制:可以使用裝飾器模式來為對(duì)象添加權(quán)限驗(yàn)證、身份認(rèn)證等功能。
總之,裝飾器模式適用于需要?jiǎng)討B(tài)地為對(duì)象添加功能,并且希望保持對(duì)象接口的一致性的場(chǎng)景。
它提供了一種靈活、可擴(kuò)展和可維護(hù)的方式來處理對(duì)象功能的變化和組合。
4、裝飾器模式的優(yōu)缺點(diǎn)
(1)優(yōu)點(diǎn):
1)動(dòng)態(tài)地為對(duì)象添加功能:裝飾器模式允許在運(yùn)行時(shí)動(dòng)態(tài)地為對(duì)象添加額外的功能,而無需修改原始對(duì)象的結(jié)構(gòu)。這對(duì)于需要靈活地?cái)U(kuò)展對(duì)象功能的情況非常有用。
2)避免使用子類進(jìn)行擴(kuò)展:通過使用裝飾器模式,可以避免創(chuàng)建大量的子類來實(shí)現(xiàn)不同組合的功能。相反,可以通過組合和堆疊裝飾器來實(shí)現(xiàn)各種功能組合,從而更好地管理和維護(hù)代碼。
3)對(duì)象功能的透明性:裝飾器模式使得客戶端可以透明地使用被裝飾對(duì)象和裝飾后的對(duì)象,無需關(guān)心具體對(duì)象的類型。這樣可以簡(jiǎn)化客戶端代碼,并且使得代碼更加清晰易懂。
4)單一職責(zé)原則:裝飾器模式可以將功能劃分到不同的裝飾器中,每個(gè)裝飾器只負(fù)責(zé)一個(gè)特定的功能,符合單一職責(zé)原則。這樣可以使得代碼更加可維護(hù)和可擴(kuò)展。
(2)缺點(diǎn):
1)增加復(fù)雜性:使用裝飾器模式會(huì)引入更多的類和對(duì)象,從而增加了系統(tǒng)的設(shè)計(jì)復(fù)雜性。這可能會(huì)導(dǎo)致代碼結(jié)構(gòu)變得復(fù)雜,不易理解和維護(hù)。
2)多層裝飾影響性能:當(dāng)使用多個(gè)裝飾器進(jìn)行功能堆疊時(shí),可能會(huì)對(duì)性能產(chǎn)生一定的影響。每個(gè)裝飾器都會(huì)增加額外的處理邏輯,可能會(huì)導(dǎo)致性能下降。
3)可能造成對(duì)象過度膨脹:如果使用過多的裝飾器或者裝飾器的組合方式不合理,可能會(huì)導(dǎo)致對(duì)象過度膨脹,使得系統(tǒng)資源消耗增加。
總結(jié):盡管裝飾器模式存在一些缺點(diǎn),但它仍然是一種強(qiáng)大且常用的設(shè)計(jì)模式,特別適用于需要?jiǎng)討B(tài)地為對(duì)象添加功能的場(chǎng)景。
在使用裝飾器模式時(shí),需要根據(jù)具體的需求和系統(tǒng)設(shè)計(jì)來權(quán)衡其優(yōu)缺點(diǎn),并確保合理地應(yīng)用該模式。
5、C++實(shí)現(xiàn)裝飾器模式的簡(jiǎn)單實(shí)例
#include <iostream>
// 抽象組件
class Component
{
public:
virtual void operation() const = 0;
};
// 具體組件
class ConcreteComponent : public Component
{
public:
void operation() const override
{
std::cout << "ConcreteComponent operation" << std::endl;
}
};
// 抽象裝飾器
class Decorator : public Component
{
protected:
Component* component;
public:
Decorator(Component* component) : component(component) {}
void operation() const override
{
if (component != nullptr)
{
component->operation();
}
}
};
// 具體裝飾器
class ConcreteDecorator : public Decorator
{
public:
ConcreteDecorator(Component* component) : Decorator(component) {}
void operation() const override
{
Decorator::operation();
additionalOperation();
}
void additionalOperation() const
{
std::cout << "Additional operation" << std::endl;
}
};
int main()
{
// 創(chuàng)建具體組件對(duì)象
Component* component = new ConcreteComponent();
// 使用具體裝飾器包裝具體組件對(duì)象
Component* decoratedComponent = new ConcreteDecorator(component);
// 調(diào)用裝飾后的操作方法
decoratedComponent->operation();
delete decoratedComponent;
delete component;
return 0;
}
在上述示例中,我們定義了一個(gè) Component 接口作為抽象組件,其中包含了一個(gè) operation 方法。ConcreteComponent 類表示具體組件,實(shí)現(xiàn)了抽象組件的接口。
Decorator 類是抽象裝飾器,繼承自 Component,并且持有一個(gè) Component 的引用。它通過該引用調(diào)用被裝飾對(duì)象的方法。
ConcreteDecorator 類是具體裝飾器,繼承自 Decorator,并實(shí)現(xiàn)了具體的裝飾邏輯。在 operation 方法中,它先調(diào)用父類的 operation 方法,然后執(zhí)行額外的操作。
在 main 函數(shù)中,我們創(chuàng)建了一個(gè)具體組件對(duì)象 component,并使用具體裝飾器 ConcreteDecorator 對(duì)其進(jìn)行包裝。最后,調(diào)用裝飾后的操作方法 decoratedComponent->operation(),會(huì)先執(zhí)行具體組件的操作方法,然后執(zhí)行具體裝飾器的額外操作。
運(yùn)行以上代碼,輸出將會(huì)是:
ConcreteComponent operation
Additional operation文章來源:http://www.zghlxwxcb.cn/news/detail-661228.html
可以看到,通過裝飾模式,我們?cè)诓桓淖兙唧w組件對(duì)象的情況下,動(dòng)態(tài)地為其添加了額外的功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-661228.html
到了這里,關(guān)于(二)結(jié)構(gòu)型模式:5、裝飾器模式(Decorator Pattern)(C++實(shí)例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!