*參考書籍* :
每當會想起考試卷簽字這件事都會讓我背脊發涼 , 然而在四年級的期末考試 , 學校出了乙個損招 , 列印成績單 , 要讓家長簽字 , 然後才能上五年級 . 當時那個恐懼 , 有那麼一瞬間覺得念書就到此為止了 . 這份成績單可以使用類來表示 , **如下 :
//抽象成績單
class schoolreport
;//四年級成績單
class fouthgradeschoolreport : public schoolreport
void
sign
(string name)
};
看看這慘不忍睹的成績 , 就這成績單還怎麼能拿得出手 ,然而這不是當時的真實情況 , 我沒有把成績單直接交給老爸 , 而是在交給他之前做了點兒技術工作 , 我要把成績單封裝一下 , 封裝分為兩步來實現:
//修飾成績單
class sugarfouthgradeschoolreport : public fouthgradeschoolreport
private:
//首先要定義你要的美化方法 , 先給老爸說學校最高的成績
void
reporthighscore()
//老爸看完成績單後 , 我再匯報學校的排名情況
void
reportsort()
};//老爸檢視修飾後的成績單
intmain()
是的 , 通過繼承就能解決這個問題 .但是在(專案中)現實的情況是很複雜的 , 可能老爸聽了我匯報最高成績後 , 直接樂開了花 , 直接就簽名了 , 後面的排名就沒必要看了, 或者老爸要先看排名的情況 , 那怎麼辦?要不斷的擴充套件?你能擴充套件多少個類?這還是乙個比較簡單的場景 , 一旦需要裝是的條件非常多 , 比如20個 , 你還能通過繼承來解決 , 你想想子類有多少個?你是不是馬上就要崩潰了!那麼我們該怎麼辦?好辦 ,我們定義一批專門負責裝飾的類 , 然後根據實際情況來決定是否需要進行裝飾.類圖如下 :
增加乙個抽象類和兩個實現類,其中decorator的作用是封裝schoolreport類,如果大家還記得**模式,那麼很容易看懂這個類圖,裝飾類的作用也就是乙個特殊的**類,真實的執行者還是被**的角色fouthgradeschoolreport , **如下 :
//修飾的抽象類
class decorator : public schoolreport
//成績單還是要被看到的
void
report()
//看完還是要簽名的
void
sign
(string name)
private:
//首先要知道是哪個成績單
schoolreport* sr;
};
看到沒,裝飾類還是把動作的執行委託給需要裝飾的物件,decorator抽象類的目的很簡單,就是要讓子類來封裝schoolreport的子類,怎麼封裝?重寫report方法!完整**如下 :
#include
#include
//#include
using namespace std;
//裝飾模式
#if 0
//抽象成績單
class schoolreport
;//修飾的抽象類
class decorator : public schoolreport
//成績單還是要被看到的
void
report()
//看完還是要簽名的
void
sign
(string name)
private:
//首先要知道是哪個成績單
schoolreport* sr;};
//最高成績修飾
class highscoredecorator : public decorator
//要在老爸看成績單之前告訴他最高成績 , 否則等他一看 , 就掄起掃帚揍我 , 我**還有機會說
void
report()
private:
//首先要定義你要的美化方法 , 先給老爸說學校最高的成績
void
reporthighscore()
};//排名情況修飾
class sortdecorator : public decorator
//老爸看完成績單後再告訴他 , 加強作用
void
report()
private:
//告訴老爸學校的排名情況
void
reportsort()
};//四年級成績單
class fouthgradeschoolreport : public schoolreport
void
sign
(string name)};
//老爸檢視修飾後的成績單
intmain()
#endif
執行結果 :
定義 :動態地給乙個物件新增一些額外的職責 . 就增加功能來說,裝飾模式相比生成子類更為靈活 .
裝飾模式的通用類圖 :
裝飾模式的結構
注意 : 在裝飾模式中,必然有乙個最基本、最核心、最原始的介面或抽象類充當component抽象構件 .
裝飾模式的優點
裝飾模式的缺點
於裝飾模式記住一點就足夠了:多層的裝飾是比較複雜的 .為什麼會複雜呢? 你想想看,就像剝洋蔥一樣,你剝到了最後才發現是最裡層的裝飾出現了問題,想象一下工作量吧,因此,儘量減少裝飾類的數量,以便降低系統的複雜度 .
裝飾模式的使用場景《設計模式之禪 第二版》
《設計模式》
設計模式C 實現(11) 裝飾模式
裝飾者模式主要實現的功能是動態的給某乙個類新增一些額外的功能,它是乙個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。設計模式的原則是多用組合少用繼承。uml 圖 特點 1.裝飾者和被裝飾者擁有相同的超型別 可能是抽象類也可能是介面 2.可以用多個裝飾類來包裝乙個物件,裝飾類可以...
C 與設計模式(11) 裝飾模式
裝飾模式動態地給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。裝飾模式注重功能的拓展,增加了類的組合,減少了類之間的繼承,而多個裝飾類進行排練組合,可以創造出不同行為的組合。穿衣服的人 class people class someone public people 衣服...
設計模式之裝飾模式 C 實現
有時候我們需要在某個類已有的功能中新增新的功能。此時我們可以用繼承的方式來給類新增功能。我們也可以用裝飾模式來實現。裝飾模式,動態的給乙個物件新增功能。與繼承的方式相比,它更有靈活性。裝飾模式實現思路是。在原有物件上嵌入想要擴充套件的裝飾器。裝飾器實現裝飾功能。其中,component定義乙個物件介...