C++ 設計模式 裝飾模式(Decorator Pattern)

gaopengtttt發表於2017-04-15
C++ 設計模式 裝飾模式

在結構型模式中裝飾模式給我留下了深刻的印象,其中也感覺到在設計模式中基本都是
依賴C++的多型來實現,裝飾模式也不例外,他允許在不改變原有類的程式碼的基礎上,
不透過直接繼承原有類的程式碼透過一個抽象介面層進行實現,甚至可以隨意的組合,
所以這裡記錄之以備使用
下面是模型圖:


下面是一個簡單的模擬程式碼,模擬本來一個工具只有寫功能,但是我們要不斷的擴充其
功能讓它有聽有讀的功能:
這是跑出來的結果
----source tool----
i can write!!
-----can listen tool-----
i can write!!
i can listene !!
----can read tool------
i can write!!
i can read !!
----can listen and  read tool------
i can write!!
i can read !!
i can listene !!


下面是程式碼:

點選(此處)摺疊或開啟

  1. #include <iostream>
  2. using namespace std;
  3. /*裝飾模式
  4.  *裝飾者模式(Decorator Pattern)動態的給一個物件新增一些額外的職責
  5.  */
  6. class ABS_TOOL
  7. {
  8. public:
  9.    virtual ~ABS_TOOL(){}
  10.    virtual void fun() = 0; //功能介面
  11. };


  12. class write:public ABS_TOOL
  13. {
  14. public:
  15.     virtual void fun()
  16.     {
  17.         cout<<"i can write!!\n";
  18.     }
  19. };

  20. class listen:public ABS_TOOL //繼承
  21. {
  22. public:
  23.     virtual ~listen(){}
  24.     listen(ABS_TOOL* tool) //依賴
  25.     {
  26.         this->tool = tool;
  27.     }
  28.      virtual void fun()
  29.     {
  30.         tool->fun();
  31.         cout<<"i can listene !!\n";
  32.     }
  33. private:
  34.     ABS_TOOL* tool; //聚合
  35. };

  36. class read:public ABS_TOOL //繼承
  37. {
  38. public:
  39.     virtual ~read(){}
  40.     read(ABS_TOOL* tool) //依賴
  41.     {
  42.         this->tool = tool;
  43.     }
  44.      virtual void fun()
  45.     {
  46.         tool->fun();
  47.         cout<<"i can read !!\n";
  48.     }
  49. private:
  50.     ABS_TOOL* tool; //聚合
  51. };


  52. int main(void)
  53. {
  54.     cout<<"----source tool----\n";
  55.     write test1;
  56.     test1.fun();
  57.     cout<<"-----can listen tool-----\n";
  58.     listen test2(&test1);
  59.     test2.fun();
  60.      cout<<"----can read tool------\n";
  61.     read test3(&test1);

  62.     test3.fun();
  63.      cout<<"----can listen and read tool------\n";
  64.     listen test4(&test3);
  65.     test4.fun();


  66.     return 0;
  67. }

作者微信:

               

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2137337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章