C++设计模式8--装饰模式 Decorator --动态的增减功能
分享一下我老師大神的人工智能教程!零基礎(chǔ),通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉(zhuǎn)載本篇文章。分享知識(shí),造福人民,實(shí)現(xiàn)我們中華民族偉大復(fù)興!
新奇的IPad
快到媳婦生日了,這幾天加班加點(diǎn)的干活,給媳婦買了個(gè)IPadMini,可把媳婦樂壞了,媳婦拿到手第一天,就跑出去跟姐妹們得瑟了一把。
?
using namespace std;class Pad{public:?Pad(){ }?virtual ~Pad(){ }?virtual void Show( ) = 0;};class IPad : public Pad{public :??? IPad( ){ }??? virtual ~IPad( ){? };??? void Show( )??? {??????? std::cout <<"新的Ipad Mini..." <<endl;??? }};int main( ){??? // 給媳婦買了一個(gè)IpadMini??? Pad *pad = new IPad( );??? pad->Show( );?????????????? // 跑出去得瑟一下?return 0;}?弄個(gè)保護(hù)套
晚上回來,我問她,開心不,她說,開心是開心,但是朋友們都說怎么沒給Pad弄個(gè)保護(hù)套,要不容易摔,摔壞了去維修可是很貴的,我嘻嘻一笑,容易直接上蘋果店買了一個(gè),走上路上美滋滋的。
?
using namespace std;// pad類的抽象接口class Pad{public:?Pad(){ }?virtual ~Pad(){ }?virtual void Show( ) = 0;};// 新的IPadMiniclass IPad : public Pad{public :??? IPad( ){ }??? virtual ~IPad( ){? };??? void Show( )??? {??????? std::cout <<"新的Ipad Mini..." <<endl;??? }};// 加了保護(hù)套的IPadMiniclass CoverIPad : public IPad{public :??? CoverIPad( ){ }??? virtual ~CoverIPad( ){? };??? void Show( )??? {??????? std::cout <<"加了保護(hù)套的,新的Ipad Mini..." <<endl;??? }};int main( ){??? // 現(xiàn)在我買了一個(gè)IpadMini??? Pad *pad = new CoverIPad( );??? pad->Show( );?????????????? // 跑出去得瑟一下}還要個(gè)貼膜???
回家拿給媳婦看,媳婦說,老公能不能再給貼個(gè)膜啊?,人家指甲長(zhǎng),萬一把屏劃花了怎么辦呢呢,還有....(此處省略一萬字),好吧再次出發(fā),等等,難道要我在派生出一個(gè)CoverFoilIPad,天天這樣子一天一個(gè)新的花樣,這框架得多復(fù)雜,不行得換個(gè)方式。
我想想,直接弄裝飾得了,那些保護(hù)套,貼膜什么的不都是裝飾么。。
好了裝飾模式出現(xiàn)了。
基礎(chǔ)還是我們的Ipad,
//公共抽象類// 對(duì)應(yīng)于 -=> 抽象構(gòu)件(Component)角色class Pad{public:?Pad(){ }?virtual ~Pad(){ }?virtual void Show( ) = 0;};// 具體構(gòu)件(Concrete Component)角色class IPad : public Pad{public :??? IPad( ){ }??? virtual ~IPad( ){? };??? void Show( )??? {??????? std::cout <<"新的Ipad Mini..." <<endl;??? }};下面是那些裝飾,保護(hù)套,貼膜,管你是什么,愛來多少來多少,咱不怕 // 裝飾(Decorator)角色:class Decorator : public Pad{public :??? Decorator(Pad *pad)??? {??????? m_pad = pad;??? }??? virtual ~Decorator( ){ };??? void Show( )??? {??????? this->m_pad->Show( );?????? // 展示一下自己的手機(jī)??? }protected:??? Pad *m_pad;??? virtual void AddDecorator( ) = 0;};// 具體裝飾(Concrete Decorator)角色class CoverDecorator : public Decorator{public :??? CoverDecorator(Pad *pad)??? :Decorator(pad)??? {??? }??? virtual ~CoverDecorator( ){ }??? void Show( )??? {??????? this->AddDecorator( );??????? Decorator::Show( );??? }protected:??? void AddDecorator( )??? {??????? std::cout <<"弄了個(gè)保護(hù)套";??? }};// 具體裝飾(Concrete Decorator)角色class FoilDecorator : public Decorator{public :??? FoilDecorator(Pad *pad)??? :Decorator(pad)??? {??? }??? virtual ~FoilDecorator( ){ }??? void Show( )??? {??????? this->AddDecorator( );??????? Decorator::Show( );??? }protected:??? void AddDecorator( )??? {??????? std::cout <<"貼了個(gè)的貼膜,";??? }};
下面看看媳婦怎么去得瑟的 int main( ){??? // 現(xiàn)在我買了一個(gè)IpadMini??? Pad *pad = new IPad( );??? pad->Show( );?????????????? // 跑出去得瑟一下??? // 不行,還需要加個(gè)保護(hù)套??? Pad *coveDeco = new CoverDecorator(pad);??? coveDeco->Show( );?????????????? // 現(xiàn)在可以了吧,再出去得色一下??? // 好吧,再來個(gè)貼膜??? Pad *foilDeco = new FoilDecorator(coveDeco);??? foilDeco->Show( );}
模式總結(jié)
概述
又叫裝飾者模式。裝飾模式是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)的擴(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象
特點(diǎn)
①裝飾對(duì)象和真實(shí)對(duì)象有相同的接口。這樣客戶端對(duì)象就可以和真實(shí)對(duì)象相同的方式和裝飾對(duì)象交互。
② 裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用(reference)
③ 裝飾對(duì)象接受所有來自客戶端的請(qǐng)求。它把這些請(qǐng)求轉(zhuǎn)發(fā)給真實(shí)的對(duì)象。
④裝飾對(duì)象可以在轉(zhuǎn)發(fā)這些請(qǐng)求以前或以后增加一些附加功能。這樣就確保了在運(yùn)行時(shí),不用修改給定對(duì)象的結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮脑O(shè)計(jì)中,通常是通過繼承來實(shí)現(xiàn)對(duì)給定類的功能擴(kuò)展。
要點(diǎn):
1.?裝飾者和被裝飾對(duì)象有相同的超類型。
2.?可以用一個(gè)或多個(gè)裝飾者包裝一個(gè)對(duì)象。
3.?裝飾者可以在所委托被裝飾者的行為之前或之后,加上自己的行為,以達(dá)到特定的目的。
4.?對(duì)象可以在任何時(shí)候被裝飾,所以可以在運(yùn)行時(shí)動(dòng)態(tài)的,不限量的用你喜歡的裝飾者來裝飾對(duì)象。
5.?裝飾模式中使用繼承的關(guān)鍵是想達(dá)到裝飾者和被裝飾對(duì)象的類型匹配,而不是獲得其行為。
6.?裝飾者一般對(duì)組件的客戶是透明的,除非客戶程序依賴于組件的具體類型。在實(shí)際項(xiàng)目中可以根據(jù)需要為裝飾者添加新的行為,做到“半透明”裝飾者。
適用場(chǎng)景與優(yōu)缺點(diǎn):
在以下情況下應(yīng)當(dāng)使用裝飾模式:
1.需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類增加附加責(zé)任。?
2.需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)地撤銷。?
3.需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變得不現(xiàn)實(shí)。
優(yōu)點(diǎn):
1.?Decorator模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是Decorator可以提供比繼承更多的靈活性。
2.?通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。
缺點(diǎn):
1.?這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著更加多的復(fù)雜性。
2.?裝飾模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小類,如果過度使用,會(huì)使程序變得很復(fù)雜。
3.?裝飾模式是針對(duì)抽象組件(Component)類型編程。但是,如果你要針對(duì)具體組件編程時(shí),就應(yīng)該重新思考你的應(yīng)用架構(gòu),以及裝飾者是否合適。當(dāng)然也可以改變Component接口,增加新的公開的行為,實(shí)現(xiàn)“半透明”的裝飾者模式。在實(shí)際項(xiàng)目中要做出最佳選擇。
?
???????????
給我老師的人工智能教程打call!http://blog.csdn.net/jiangjunshow
總結(jié)
以上是生活随笔為你收集整理的C++设计模式8--装饰模式 Decorator --动态的增减功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中文件包含#include使用尖括
- 下一篇: 快速建站系统