国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

簡單了解設計模式中的裝飾者模式及C++版代碼實現

2020-01-26 14:42:34
字體:
來源:轉載
供稿:網友

由遇到的問題引出的裝飾模式

在 OO 設計和開發過程,可能會經常遇到以下的情況:我們需要為一個已經定義好的類添加新的職責(操作),通常的情況我們會給定義一個新類繼承自定義好的類,這樣會帶來一個問題(將在本模式的討論中給出)。通過繼承的方式解決這樣的情況還帶來了系統的復雜性,因為繼承的深度會變得很深。

而裝飾提供了一種給類增加職責的方法,不是通過繼承實現的,而是通過組合。

有關這些內容在討論中進一步闡述。
模式選擇
裝飾模式典型的結構圖為:

201639103245900.jpg (557×364)

在 結 構 圖 中 , ConcreteComponent 和裝飾需 要 有 同 樣 的 接 口 , 因 此ConcreteComponent 和裝飾有著一個共同的父類。這里有人會問,讓裝飾直接維護一個指向 ConcreteComponent 引用(指針)不就可以達到同樣的效果,答案是肯定并且是否定的。肯定的是你可以通過這種方式實現,否定的是你不要用這種方式實現,因為通過這種方式你就只能為這個特定的 ConcreteComponent 提供修飾操作了,當有了一個新的ConcreteComponent 你 又 要 去 新 建 一 個裝飾來 實 現 。 但 是 通 過 結 構 圖 中 的ConcreteComponent 和裝飾有一個公共基類,就可以利用 OO 中多態的思想來實現只要是 Component 型別的對象都可以提供修飾操作的類,這種情況下你就算新建了 100 個Component 型別的類 ConcreteComponent,也都可以由裝飾一個類搞定。這也正是裝飾模式的關鍵和威力所在了。

當然如果你只用給 Component 型別類添加一種修飾,則裝飾這個基類就不是很必要了。

實例

#include <iostream> using namespace std;  class TestA { public:   void display_a()   {     cout<<"display a..."<<endl;   } };  class TestB { public:   void display_b()   {     cout<<"display b..."<<endl;   } };  class Facade {   TestA *testa;   TestB *testb;  public:   Facade()   {     testa = new TestA();     testb = new TestB();   }   ~Facade()   {     delete testa;     delete testb;   }    void MethodA()   {     testa->display_a();     testb->display_b();   } };  int main() {   Facade *facade = new Facade();      facade->MethodA();    system("pause");   return 0; } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平湖市| 凤庆县| 吴川市| 宝兴县| 齐齐哈尔市| 内乡县| 什邡市| 德保县| 肃南| 万宁市| 灵武市| 镇江市| 通城县| 阳朔县| 澳门| 广汉市| 易门县| 顺义区| 墨竹工卡县| 丰台区| 德清县| 贡嘎县| 辽中县| 皮山县| 大荔县| 南平市| 新平| 郎溪县| 上林县| 临邑县| 周口市| 龙口市| 沐川县| 泌阳县| 湾仔区| 枣庄市| 新源县| 古交市| 监利县| 抚远县| 利辛县|