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