亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設(shè)計模式之裝飾模式

2020-05-23 14:21:05
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++設(shè)計模式之裝飾模式,裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,是從一個對象外部來給對象添加功能,需要的朋友可以參考下
 
 

前言

在實際開發(fā)時,你有沒有碰到過這種問題;開發(fā)一個類,封裝了一個對象的核心操作,而這些操作就是客戶使用該類時都會去調(diào)用的操作;而有一些非核心的操作,可能會使用,也可能不會使用;現(xiàn)在該怎么辦呢?

1.將這些非核心的操作全部放到類中,這樣,一個類就包含了很多核心的操作和一些看似有關(guān),但是又無關(guān)的操作;這就會使核心類發(fā)生“爆炸”的現(xiàn)象,從而使核心類失去了一定的價值,也使使用核心類的客戶在核心操作和非核心操作中掙扎;

2.使用繼承來擴展核心類,需要使用核心類時,直接建立核心類對象;當需要使用核心類擴展類時,就建立核心類擴展類對象;這樣貌似是一種很有效的方法;但是由于繼承為類型引入的靜態(tài)特質(zhì),使得這種擴展方式缺乏靈活性;同時,又掉入了另一個陷阱,隨著擴展功能的增多,子類也會增多,各種子類的組合,就會導(dǎo)致類的膨脹,最后,就會被淹沒在類的海洋;此時,也不用我多說,你是不是想起了橋接模式,橋接模式就是為了適應(yīng)多個維度的變化而發(fā)生子類“爆炸”的情況,但是,橋接模式是為了適應(yīng)抽象和實現(xiàn)的不同變化,并不適用于我這里說的。那如何是好,這就要說到今天總結(jié)的裝飾模式了。

什么是裝飾模式?

在GOF的《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中對裝飾模式是這樣說的:動態(tài)地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。

裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,是從一個對象外部來給對象添加功能。通常給對象添加功能,要么直接修改對象添加相應(yīng)的功能,要么派生對應(yīng)的子類來擴展,抑或是使用對象組合的方式。顯然,直接修改對應(yīng)的類這種方式并不可取。在面向?qū)ο蟮脑O(shè)計中,而我們也應(yīng)該盡量使用對象組合,而不是對象繼承來擴展和復(fù)用功能。裝飾器模式就是基于對象組合的方式,可以很靈活的給對象添加所需要的功能。裝飾器模式的本質(zhì)就是動態(tài)組合。動態(tài)是手段,組合才是目的??傊?,裝飾模式是通過把復(fù)雜的功能簡單化,分散化,然后再運行期間,根據(jù)需要來動態(tài)組合的這樣一個模式。它使得我們可以給某個對象而不是整個類添加一些功能。

UML類圖

C++設(shè)計模式之裝飾模式

Component:定義一個對象接口,可以給這些對象動態(tài)地添加職責;

ConcreteComponent:定義一個具體的Component,繼承自ConcreateComponent,重寫了Component類的虛函數(shù);

Decorator:維持一個指向Component對象的指針,該指針指向需要被裝飾的對象;并定義一個與Component接口一致的接口;

ConcreteDecorator:向組件添加職責。

代碼實現(xiàn):

 

復(fù)制代碼代碼如下:

/*
** FileName     : DecoratorPatternDemo
** Author       : Jelly Young
** Date         : 2013/12/19
** Description  : More information, please go to http://www.49028c.com
*/
#include <iostream>
using namespace std;
class Component
{
public:
     virtual void Operation() = 0;
};
class ConcreteComponent : public Component
{
public:
     void Operation()
     {
          cout<<"I am no decoratored ConcreteComponent"<<endl;
     }
};
class Decorator : public Component
{
public:
     Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
     void Operation()
     {
          if (m_pComponentObj != NULL)
          {
               m_pComponentObj->Operation();
          }
     }
protected:
     Component *m_pComponentObj;
};
class ConcreteDecoratorA : public Decorator
{
public:
     ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
     void Operation()
     {
          AddedBehavior();
          Decorator::Operation();
     }
     void  AddedBehavior()
     {
          cout<<"This is added behavior A."<<endl;
     }
};
class ConcreteDecoratorB : public Decorator
{
public:
     ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
     void Operation()
     {
          AddedBehavior();
          Decorator::Operation();
     }
     void  AddedBehavior()
     {
          cout<<"This is added behavior B."<<endl;
     }
};
int main()
{
     Component *pComponentObj = new ConcreteComponent();
     Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
     pDecoratorAOjb->Operation();
     cout<<"============================================="<<endl;
     Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
     pDecoratorBOjb->Operation();
     cout<<"============================================="<<endl;
     Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
     pDecoratorBAOjb->Operation();
     cout<<"============================================="<<endl;
     delete pDecoratorBAOjb;
     pDecoratorBAOjb = NULL;
     delete pDecoratorBOjb;
     pDecoratorBOjb = NULL;
     delete pDecoratorAOjb;
     pDecoratorAOjb = NULL;
     delete pComponentObj;
     pComponentObj = NULL;
}

 

使用場合

1.在不影響其他對象的情況下,以動態(tài)的,透明的方式給單個對象添加職責;
2.處理那些可以撤銷的職責;
3.當不能采用生成子類的方法進行擴充時。一種情況是,可能存在大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

注意事項

1.接口的一致性;裝飾對象的接口必須與它所裝飾的Component的接口是一致的,因此,所有的ConcreteDecorator類必須有一個公共的父類;這樣對于用戶來說,就是統(tǒng)一的接口;

2.省略抽象的Decorator類;當僅需要添加一個職責時,沒有必要定義抽象Decorator類。因為我們常常要處理,現(xiàn)存的類層次結(jié)構(gòu)而不是設(shè)計一個新系統(tǒng),這時可以把Decorator向Component轉(zhuǎn)發(fā)請求的職責合并到ConcreteDecorator中;

3.保持Component類的簡單性;為了保證接口的一致性,組件和裝飾必須要有一個公共的Component類,所以保持這個Component類的簡單性是非常重要的,所以,這個Component類應(yīng)該集中于定義接口而不是存儲數(shù)據(jù)。對數(shù)據(jù)表示的定義應(yīng)延遲到子類中,否則Component類會變得過于復(fù)雜和臃腫,因而難以大量使用。賦予Component類太多的功能,也使得具體的子類有一些它們它們不需要的功能大大增大;

實現(xiàn)要點

1.Component類在Decorator模式中充當抽象接口的角色,不應(yīng)該去實現(xiàn)具體的行為。而且Decorator類對于Component類應(yīng)該透明,換言之Component類無需知道Decorator類,Decorator類是從外部來擴展Component類的功能;

2.Decorator類在接口上表現(xiàn)為“is-a”Component的繼承關(guān)系,即Decorator類繼承了Component類所具有的接口。但在實現(xiàn)上又表現(xiàn)為“has-a”Component的組合關(guān)系,即Decorator類又使用了另外一個Component類。我們可以使用一個或者多個Decorator對象來“裝飾”一個Component對象,且裝飾后的對象仍然是一個Component對象;

3.Decortor模式并非解決“多子類衍生的多繼承”問題,Decorator模式的應(yīng)用要點在于解決“主體類在多個方向上的擴展功能”——是為“裝飾”的含義;

4.對于Decorator模式在實際中的運用可以很靈活。如果只有一個ConcreteComponent類而沒有抽象的Component類,那么Decorator類可以是ConcreteComponent的一個子類。如果只有一個ConcreteDecorator類,那么就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合并成一個類。

5.Decorator模式的優(yōu)點是提供了比繼承更加靈活的擴展,通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合;

6.由于使用裝飾模式,可以比使用繼承關(guān)系需要較少數(shù)目的類。使用較少的類,當然使設(shè)計比較易于進行。但是,在另一方面,使用裝飾模式會產(chǎn)生比使用繼承關(guān)系更多的對象。更多的對象會使得查錯變得困難,特別是這些對象看上去都很相像。

與橋接模式的區(qū)別

之前總結(jié)了C++設(shè)計模式——橋接模式;你會發(fā)現(xiàn),二者都是為了防止過度的繼承,從而造成子類泛濫的情況。那么二者之間的主要區(qū)別是什么呢?橋接模式的定義是將抽象化與實現(xiàn)化分離(用組合的方式而不是繼承的方式),使得兩者可以獨立變化??梢詼p少派生類的增長。如果光從這一點來看的話,和裝飾者差不多,但兩者還是有一些比較重要的區(qū)別:

1.橋接模式中所說的分離,其實是指將結(jié)構(gòu)與實現(xiàn)分離(當結(jié)構(gòu)和實現(xiàn)有可能發(fā)生變化時)或?qū)傩耘c基于屬性的行為進行分離;而裝飾者只是對基于屬性的行為進行封閉成獨立的類,從而達到對其進行裝飾,也就是擴展。比如:異常類和異常處理類之間就可以使用橋接模式來實現(xiàn)完成,而不能使用裝飾模式來進行設(shè)計;如果對于異常的處理需要進行擴展時,我們又可以對異常處理類添加Decorator,從而添加處理的裝飾,達到異常處理的擴展,這就是一個橋接模式與裝飾模式的搭配;

2.橋接中的行為是橫向的行為,行為彼此之間無關(guān)聯(lián),注意這里的行為之間是沒有關(guān)聯(lián)的,就比如異常和異常處理之間是沒有行為關(guān)聯(lián)的一樣;而裝飾者模式中的行為具有可疊加性,其表現(xiàn)出來的結(jié)果是一個整體,一個各個行為組合后的一個結(jié)果。

總結(jié)

裝飾模式重點在裝飾,對核心功能的裝飾作用;將繼承中對子類的擴展轉(zhuǎn)化為功能類的組合,從而將需要對子類的擴展轉(zhuǎn)嫁給用戶去進行調(diào)用組合,用戶如何組合由用戶去決定。我在學(xué)習裝飾模式時,就是重點分析了“裝飾”這個詞,我們都知道,裝飾是在一個核心功能上添加一些附屬功能,從而讓核心功能發(fā)揮更大的作用,但是最終它的核心功能是不能丟失的。這就好比我們進行windows shell開發(fā)時,我們是對windows的這層殼進行了功能的裝飾,從而實現(xiàn)了我們需要的一些裝飾功能,但是最終的功能還是由windows shell去完成。這就好比,我們的裝飾就是給核心功能添加了一層外衣,讓它看起來更漂亮和完美。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
一个人免费观看日本www视频| 3dmax动漫人物在线看| 色综合久久av| 久久这里只有精品23| 亚洲理论在线a中文字幕| 天天射天天干天天| 极品美女一区二区三区视频| 国产亚洲aⅴaaaaaa毛片| 黄网在线观看视频| 国产麻豆视频在线观看| 另类小说视频一区二区| 国产成人精品免费网站| 久久久视频免费观看| 97超级碰碰人国产在线观看| 日日日日影院| 精品国产av一区二区| 日本一二三区在线| 久久午夜夜伦鲁鲁片| 久久久久久一区二区| 色88久久久久高潮综合影院| 亚洲做受高潮无遮挡| 免费欧美在线视频| 91精品国产综合久久婷婷香蕉| 欧美性猛交xxxx富婆弯腰| 亚洲毛片在线观看.| 国产精品久久久久久久久免费看| 777精品视频| 欧美jizzhd69巨大| 国产精品乱人伦中文| 不卡一区二区三区四区五区| 日韩三级电影网站| 中文字幕在线免费专区| 日本三级久久久| 日韩精品一区二区三区免费观影| 婷婷丁香激情综合| 四虎av在线| 日本精品一区二区三区在线播放| 91最新在线视频| 色综合 综合色| 国内精品久久久久影院一蜜桃| 久久久久久成人网| 午夜视频久久久久久| 亚洲丰满少妇videoshd| 亚洲午夜三级在线| 圆产精品久久久久久久久久久| 9.1国产丝袜在线观看| 四虎一区二区三区| 欧美中在线观看| 亚洲精品综合久久中文字幕| 国产一区欧美| 91热爆在线观看| 欧美亚洲综合视频| 妺妺窝人体色www看人体| 你懂的网站在线观看网址| 色视频精品视频在线观看| 欧美日韩午夜在线视频| 日韩精品一区第一页| 九色自拍论坛| 国产成人av片| 国产精品系列视频| 天天干天天色天天干| 日韩欧美成人区| 久久精品99久久香蕉国产色戒| 亚洲精品97| 欧美怡红院视频一区二区三区| 国产黄色片免费看| 爱啪视频在线观看视频免费| 亚洲成人免费在线视频| 久久久久久久久久久久久女过产乱| 伊人狠狠色丁香综合尤物| 一道精品视频一区二区三区男同| 99se视频在线观看| 国产欧美日韩在线观看| 日本免费一区二区三区视频观看| 最近中文字幕在线视频| 成人欧美一区二区三区小说| 国产日韩一区二区三免费高清| 国产亚洲精品激情久久| 中文字幕av网| 爽好多水快深点欧美视频| 成人片免费看| 国产精品一二三四| 免费在线观看的电影网站| 欧美精彩视频一区二区三区| 国产日韩一区二区在线观看| 91蝌蚪九色| av成人影院在线| 欧美日韩一区久久| av中文字幕在线不卡| 免费不卡在线视频| 成人片在线看| 美女网站久久| 亚洲欧美视频在线观看| 国产一区在线观看视频| 欧美精品在线一区| 日韩成人黄色片| 男人天堂欧美日韩| 亚洲女人天堂色在线7777| 久久精品国产成人av| 国产原创精品视频| 免费a在线观看播放| 九色porny视频在线观看| 99re这里有精品| 狠狠色综合一区二区| 日韩视频免费观看高清在线视频| 久久艹这里只有精品| 91成品人片a无限观看| 久久精品色欧美aⅴ一区二区| 男人操女人免费软件| 国产午夜精品一区二区理论影院| 羞羞视频网站在线观看| 国产人妻777人伦精品hd| 97激碰免费视频| 欧美爱爱视频网站| 首页国产精品| 中文在线a天堂| 亚洲一级二级三级| 国产乱人视频免费播放| 国产1区2区在线观看| 久久五月精品中文字幕| 成人网址在线观看| 91视频一区二区三区| 91精品久久久久久久久不口人| 国产精品久久免费视频| 性生生活性生交a级| 国产成人avxxxxx在线看| 性娇小13――14欧美| 亚洲成人自拍网| 成人在线精品| www.91av.com| 日精品一区二区三区| 蜜臀av在线播放一区二区三区| 97caopor国产在线视频| 日韩在线亚洲| 日韩欧美你懂的| av中文字幕在线免费观看| 欧美3p在线观看| 6080yy精品一区二区三区| 亚洲国产精品人久久电影| 怡红院怡春院首页| 99久久精品国产一区色| 日韩欧美激情视频| 日本不卡在线| 在线观看视频你懂得| 国产91色在线观看| 国产三级第一页| 一区二区三区在线影院| 手机在线观看国产精品| 成人在线视频一区二区三区| 国产嫩草影院久久久久| 136国产福利精品导航网址| 最新av网址在线观看| 国产精品二区一区二区aⅴ| 成人性生交xxxxx网站| 福利一区二区三区四区| 国内自拍视频网| 欧美在线首页| 极品魔鬼身材女神啪啪精品| 成人av动漫在线观看| 鲁大师成人一区二区三区| 日本亚洲免费观看| 一区二区三区四区精品| 在线视频第一页| 青丝免费观看高清影视| 黄色污污视频在线观看| 99久久婷婷国产综合精品电影| 99热亚洲精品| 中文字幕黄色片| av手机天堂| 亚洲第一精品网站| 日韩电影免费在线观看中文字幕| 亚洲视频日韩精品| 精彩视频一区二区| 丝袜美腿一区| 性欧美黑人xxxx| 少妇bbbb搡bbbb| 亚洲最大综合网| 成人黄色大片在线观看| 国产精品免费视频一区一| 日韩精品一区二区三区三区免费| 欧美特黄aaaaaa| 成人在线免费观看91| 亚洲综合日韩在线| 亚洲国产一区二区视频| 九九九国产视频| 多人啪嗒啪嗒在线观看免费| 亚洲成人精品综合在线| 国产成人无码一二三区视频| 欧美性资源免费| 国产精品国产三级在线观看| 男人添女人下部高潮视频在线观看| 初尝黑人巨炮波多野结衣电影| 麻豆传媒在线看| 久久999免费视频| 美女做暖暖视频免费在线观看全部网址91| 日韩国产精品亚洲а∨天堂免| 91精品999| 天天射天天操天天干| 色噜噜夜夜夜综合网| 日韩免费观看在线观看| 无码国产伦一区二区三区视频| 免费av在线一区二区| 亚洲成人一品| 超碰在线免费| 欧美猛少妇色xxxxx| 欧美尤物巨大精品爽| 欧美1区2区3区4区| 国产视频一区二区三区在线播放| 欧洲午夜精品| 黄色片在线免费看| 精品国产伦一区二区三区免费| 国产精品18久久久久久久网站| 九九热99久久久国产盗摄| 亚洲图片视频小说| 福利精品视频在线| 欧美一级视频免费观看| 欧美一级夜夜爽| www.成人三级视频| 日韩精品中文字幕第1页| 91精品视频在线播放| 精品国产三级| 久久亚洲捆绑美女| 免费一级特黄特色大片| 美女在线一区二区| 在线天堂视频| 欧美激情一二三区| 色婷婷久久99综合精品jk白丝| 国产亚洲亚洲| 天海翼亚洲一区二区三区| 国产偷人爽久久久久久老妇app| 国产丝袜精品视频| 国产男女av| 国产亚洲欧美久久久久| 精品国产乱码久久久| 1769在线观看| 欧美图区在线视频| 国产一区二区三区在线观看免费视频| 国产熟妇一区二区三区四区| 午夜国产视频| 午夜欧美大尺度福利影院在线看| 成人黄色激情视频| 一级片avav网址| 色的视频在线观看免费播放| 免费h在线看| 亚洲欧洲一区二区| 国产有码一区二区| 精品国产一区二区三区不卡在线| 狠狠色伊人亚洲综合成人| 久久久av网站| 亚洲免费在线观看av| 91免费在线看片| 国产精品乱码久久久久| 久久亚洲成人精品| 榴莲视频成人app| av在线电影播放| www.国产毛片| 香蕉成人av| 日本女优一区| 亚洲精品一二三四五区| 久久久久久久久99精品大| 国产一级片91| 国产99视频在线| 五月婷婷六月丁香激情| 午夜精品一区二区三区在线观看| 青青艹在线视频| 欧美一区二区三区男人的天堂| 久久高清免费视频| 免费在线观看黄网站| 欧美牲交a欧美牲交aⅴ免费真| 亚洲色婷婷久久精品av蜜桃| 成人网视频在线观看| 久久99精品国产.久久久久| 亚洲激情在线观看视频免费| 国产美女在线播放| 中文字幕无线精品亚洲乱码一区| 成人综合在线网站| 九九久久精品| av岛国在线| 真实新婚偷拍xxxxx| 欧美一级淫片播放口| 欧美午夜精品久久久| 国产剧情在线观看一区二区| 伊人精品一区二区三区| 久久精品一区二区三区四区| 91九色蝌蚪| 亚洲av人人澡人人爽人人夜夜| 国产亚洲高清在线观看| www.激情网| 精品嫩模一区二区三区| 欧美高清视频看片在线观看| 狠狠久久五月精品中文字幕| 欧美日韩视频免费看| 午夜国产精品一区| 水蜜桃亚洲一二三四在线| 在线观看av资源| 精品日韩欧美在线| 国产精品日韩一区二区三区| 97视频热人人精品免费| 亚洲精品国产一区二区三区| 亚洲最大网站| 欧美日韩一区中文字幕| 日日噜噜噜噜夜夜爽亚洲精品| 欧美18视频| 99久精品视频在线观看视频| 精品久久久久一区二区国产| 亚洲精品v欧美精品v日韩精品| 国产乱子夫妻xx黑人xyx真爽| 福利网址在线观看| 久久久久久一区二区| 日本成在线观看| 日韩三级精品电影久久久| 欧美精品videosex极品1| 国产毛片一区二区三区va在线| 欧美人妻一区二区三区| 欧美日韩综合在线免费观看| 不卡的av电影| 在线免费观看视频网站| 日韩av无码中文字幕| 国产精品一区二区资源| 亚洲一区免费在线| 国产l精品国产亚洲区久久| 91精品麻豆日日躁夜夜躁| 久久视频一区二区| 免费在线成人av| 91福利免费观看| 成人性视频免费看| 欧美午夜精彩| 日韩高清中文字幕|