日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

C++設計模式之裝飾模式

2020-05-23 14:21:05
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之裝飾模式,裝飾模式能夠實現動態的為對象添加功能,是從一個對象外部來給對象添加功能,需要的朋友可以參考下
 
 

前言

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

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

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

什么是裝飾模式?

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對裝飾模式是這樣說的:動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。

裝飾模式能夠實現動態的為對象添加功能,是從一個對象外部來給對象添加功能。通常給對象添加功能,要么直接修改對象添加相應的功能,要么派生對應的子類來擴展,抑或是使用對象組合的方式。顯然,直接修改對應的類這種方式并不可取。在面向對象的設計中,而我們也應該盡量使用對象組合,而不是對象繼承來擴展和復用功能。裝飾器模式就是基于對象組合的方式,可以很靈活的給對象添加所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把復雜的功能簡單化,分散化,然后再運行期間,根據需要來動態組合的這樣一個模式。它使得我們可以給某個對象而不是整個類添加一些功能。

UML類圖

C++設計模式之裝飾模式

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

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

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

ConcreteDecorator:向組件添加職責。

代碼實現:

 

復制代碼代碼如下:

/*
** FileName     : DecoratorPatternDemo
** Author       : Jelly Young
** Date         : 2013/12/19
** Description  : More information, please go to http://www.conghuacea.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.在不影響其他對象的情況下,以動態的,透明的方式給單個對象添加職責;
2.處理那些可以撤銷的職責;
3.當不能采用生成子類的方法進行擴充時。一種情況是,可能存在大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

注意事項

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

2.省略抽象的Decorator類;當僅需要添加一個職責時,沒有必要定義抽象Decorator類。因為我們常常要處理,現存的類層次結構而不是設計一個新系統,這時可以把Decorator向Component轉發請求的職責合并到ConcreteDecorator中;

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

實現要點

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

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

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

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

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

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

與橋接模式的區別

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

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

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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩精品在线第一页| 欧美不卡视频| 国产一二三精品| 欧美日韩亚洲国内综合网| 欧美国产综合在线V| 高清一区二区| 亚洲福利一区| 精品国产欧美| 欧美中文字幕在线| 国产三级第一页| 91精品婷婷国产综合久久| 国产一区不卡精品| 国产91欧美| 国产亚洲视频中文字幕视频| av不卡免费看| 亚洲欧美中文字幕在线一区| 中文字幕在线亚洲| www.av中文字幕| 亚洲黄色一区二区| 中文字幕在线高清| 精品九九久久| 欧美日韩中文另类| 久久久水蜜桃| 国产高清在线视频| 尤物av一区二区| 欧美不卡视频一区发布| 国产123在线| 91精品观看| 韩国av一区二区| 日韩一级在线视频 | 国产成人精品三级| 91精品国产免费| 日韩精品免费观看视频| 久久久综合av| 国产亚洲短视频| 国产乱码在线| 欧美日韩国产成人| 亚洲欧美中文字幕在线一区| 一区二区三区在线播放视频| 一区二区不卡视频| 一区二区三区四区五区视频在线观看| 国产在线第一页| 亚洲欧洲三级| 亚洲黄色片在线观看| 欧美日韩国产观看视频| 欧美中日韩在线| 欧美一级一级性生活免费录像| 一区二区日韩免费看| 国产网站av| 精品激情国产视频| 午夜精品免费视频| 国产欧美中文字幕| 中文字幕在线播出| 午夜国产视频 | 日韩久久不卡| 中文字幕最新精品| 精品在线一区二区三区| 中文字幕欧美亚洲| 中文字幕亚洲第一| 一区视频在线播放| 日韩专区中文字幕| 亚洲一二三不卡| 日韩一级网站| 欧美日韩亚洲系列| 欧美国产一级片| 精人妻一区二区三区| 日韩在线视频在线观看| 日韩中文字幕亚洲| 刘玥91精选国产在线观看| 日韩视频在线免费播放| 欧洲精品二区| 国产在线黄色| 99国内精品| 国产不卡视频在线| 粉嫩喷白浆久久| 精品无人国产偷自产在线| 精品日韩视频在线观看| 91精品国产网站| 欧美日韩综合色| 91一区二区| 91精品在线观看国产| 日韩三级精品| 国产成人精品亚洲| 亚洲女人天堂色在线7777| 欧美亚洲免费高清在线观看| 国内激情久久| 日本不卡高清视频一区| 精品国内自产拍在线视频| 日韩欧美久久久| 91精品国产99| 免费视频国产一区| 欧美日韩精品区| 久久夜色精品国产欧美乱极品 | 在线视频不卡国产V| 中文字幕在线视频精品| 精品成人久久av| 日韩欧美色综合| 国产91久久久久| 狠狠色综合色区| 中文字幕五月欧美| 日韩精品视频网| www中文字幕| 国产一级在线播放| www高清在线视频日韩欧美| 亚洲精华国产欧美| 在线视频观看日韩| 国产男女av| 国产视频二区| 日韩黄色在线播放| 国产欧美高清在线| 午夜成人鲁丝片午夜精品| 久久99蜜桃精品| 日韩精品资源二区在线| 免费高清在线一区| 精品视频999| 精品亚洲国内自在自线福利| 日韩三级视频中文字幕| 日韩欧美中文字幕一区| 欧美日韩亚洲不卡| 91久久精品午夜一区二区| 国产精品福利视频一区二区三区| 亚洲一区在线观看视频| 国产日韩综合| 日韩欧美一级精品久久| 国产成人精品免费网站| 欧美日韩国产不卡| 一区二区视频免费看| av免费在线播放| 在线日韩欧美| 久久精品一级爱片| 日韩视频 中文字幕| 51精品免费网站| 亚洲高清视频一区| 国产小视频在线观看| 精品在线99| 日本亚洲视频在线| 日韩欧美一卡二卡| 国产成人一二三区| 久草亚洲一区| 国产在线视频一区二区| 欧美日韩成人一区二区| 国产传媒久久久| 久久精品最新免费国产成人| 欧美日韩亚洲视频| av高清一区| 欧洲精品久久久| 日韩中文字幕| 中文字幕乱码在线| 中文字幕国产日韩| 免费国产成人看片在线| 日韩视频免费直播| 日韩精品手机在线| 久久久久久99精品| 顶级网黄在线播放| 亚洲欧美99| 久久99久久久久| 国产永久在线观看| 精品日韩欧美| 欧美久久一二三四区| 日韩三级精品| 亚洲视频日韩| 日韩欧美不卡在线| 欧美日韩国产一区中文午夜 | 在线不卡一区二区| 国产视频一区三区| 在线国产91| 亚洲一区资源| 亚洲羞羞网站| 久久久精品午夜少妇| 国产成人精品av久久| 亚洲.国产.中文慕字在线| 欧美片网站免费| 亚欧成人精品| 红桃视频国产一区| 91国内精品在线视频| 精品综合久久久久| 日韩精品视频免费看| 99精品免费观看| 国产在线播放一区二区| 亚洲一区在线观看免费| 国产欧美日韩在线看| 日韩色在线观看| 在线欧美日韩国产| 天天综合色天天| 日韩中文字幕在线观看视频| 999在线视频| 欧美亚洲国产日韩| 中文字幕日韩视频| 欧美一级搡bbbb搡bbbb| www.中文字幕在线观看| 国产一卡2卡3卡免费网站| 一区二区精品| 成人a在线观看| 日韩亚洲一区中文字幕| 欧美1区免费| www高清在线视频日韩欧美| 国产一级片播放| 香蕉精品久久| 狠狠色噜噜狠狠狠狠97| 国产资源中文字幕| 亚洲大胆人体av| 国产免费不卡av| 日韩精品在线观看视频| 久久99久久久久久久噜噜| 亚洲欧美伊人| 日韩视频精品在线| 精品日韩一区二区三区免费视频| 精品久久蜜桃| 国产一区不卡在线| 人成在线免费视频| 91精品国产入口| 日韩a一区二区| 日韩欧美国产免费| 日韩免费视频一区二区| 国产在线一在线二| 91精品国产91综合久久蜜臀| 91亚洲欧美| 国产精久久久久| 中文字幕亚洲在| 视频一区日韩| 日韩午夜黄色| 亚洲国产福利| 欧美乱大交xxxxx免费| 91精品在线视频观看| 在线观看区一区二| 你懂的亚洲视频| 亚洲黄页一区| 日韩欧美中文第一页| 一区在线免费| 国产福利一区二区在线精品| 欧美熟妇乱码在线一区| 欧美亚洲国产免费| 91精品国产91| 欧美日韩在线观看成人| 国产在线一区二区视频| 午夜一区二区三区免费| 人人做人人澡人人爽欧美| 中文字幕欧美日韩| 亚洲影视资源网| 亚洲第一福利视频在线| 国产在线看一区| 亚洲人成欧美中文字幕| 久久99久久久欧美国产| 欧美大片在线观看一区| 成人禁用看黄a在线| 欧美日韩国产一中文字不卡| 欧美日韩国产系列| 91av久久久| 日韩在线欧美| 国产丝袜一区二区| 91精品国产全国免费观看| 91精品视频在线| 中文字幕亚洲高清| 亚洲小说春色综合另类电影| 欧美黄页在线免费观看| 亚洲一区在线视频观看| 欧美日韩中文字幕在线观看| 1区不卡电影| 欧美日韩综合视频网址| 日本不卡视频一区| 日韩视频一区在线观看| 欧美日韩精品中文字幕| 欧美日韩综合高清一区二区| 国产资源中文字幕| 91精品啪在线观看国产60岁| 日韩国产亚洲欧美| 久久欧美中文字幕| 中文字幕在线高清| 欧美日韩夫妻久久| 91久久精品国产91性色69| 99久久婷婷| 欧美日韩精品综合| 日韩精品免费视频一区二区三区| 中文字幕五月欧美| 精品国产99久久久久久| 一区二区三区在线播| 91精品国产调教在线观看| 欧美 日韩 国产在线观看| 中文字幕亚洲视频| 日韩三级精品| 亚洲视频日韩| 国产在线www| 日韩亚洲欧美中文字幕| 九九视频精品免费| 香蕉av一区| 国产福利免费在线观看| 日韩免费视频一区二区视频在线观看 | 国产欧美久久久精品免费| 欧美日韩91| 久久蜜桃精品| 精产国产伦理一二三区| 国产九九在线| 国产一卡二卡3卡4卡四卡在线| a视频免费在线观看| 91精品在线视频观看| 91精品视频观看| 日韩精品视频网| 成人xxxx| 国内激情久久| 91久久中文| 国产在线精品国自产拍免费| 国产欧美日韩在线观看| 中文字幕欧美亚洲| 欧美日韩精品免费看| 日韩精品视频免费播放| 国产乱码在线| 日韩欧美一二三区| 中文字幕一区不卡| 91精品在线观| 国产视频三级在线观看播放| 欧美1234区| 欧美二三四区| 日韩欧美国产不卡| 欧美日韩精品电影| 99精品在线播放| 国产最新在线| 亚洲成av人片一区二区密柚| 欧美亚洲综合视频| 欧美日韩精品综合在线| 日韩欧美不卡视频| 中文亚洲免费| 日韩中文字幕视频在线观看| 日韩欧美综合视频| 精品视频—区二区三区免费| 欧美日韩国产专区| 蜜桃精品在线| 欧美在线日韩在线| 二区中文字幕| 日韩中文字幕在线视频观看| 午夜亚洲一区| 一本大道一区二区三区| 国产在线看一区| 国产高清一级片| 日韩手机在线观看视频| 91精品国产自产在线丝袜啪| 国产在线观看精品| 精品日韩在线观看| 日韩视频一区| 国产69精品久久app免费版| 一区二区三区精品在线| 国产在线观看色| 91精品国产综合久久久蜜臀粉嫩| 日韩字幕在线观看| 日韩av不卡在线观看| 国产亚洲二区| 日韩欧美字幕| 亚洲一区导航| 国内精品99| 国产在线一区二区视频| 日韩国产一区久久| 欧美日韩在线第一页| 国产一二三精品| 国产日韩三级| 日韩午夜中文字幕| 中文字幕国产视频| 国产主播中文字幕| 国产资源中文字幕| 中文字幕一区不卡| 视频在线一区二区| 亚洲综合日韩中文字幕v在线| 欧美午夜精品在线| 久久久91精品国产| 日本黄色一区二区三区| 中文字幕 欧美 日韩| 先锋男人资源站| 欧美日韩国产观看视频| 国产日韩三级| 日本亚洲欧美三级| 麻豆精品视频入口| 一区视频在线播放| 精品一区二区在线观看视频| 天堂在线www天堂中文在线| 国产一二三四| 亚洲三级国产| 国产一区 二区 三区一级| 亚洲综合在线视频| 蜜桃视频中文字幕| 99综合视频| 欧美人妻一区二区三区| 91xxx在线观看| 欧美日韩中文国产| 精品日韩av| 天天综合色天天| 国产视频1区| 日韩欧美视频一区二区三区四区| 国产欧美日韩中文字幕在线| 不卡福利视频| 日韩精品―中文字幕| 久久在线91| 中文字幕在线导航| 欧美日韩国产专区| 国产不卡一区| 一级网站免费观看| 国产高清精品在线观看| 99国内精品| 日韩亚洲一区中文字幕| 国产欧美日韩久久| av高清一区| 日韩三级视频在线| 欧美另类久久久品|