歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言和設計模式(之組合模式)

C語言和設計模式(之組合模式)

日期:2017/3/1 10:46:40   编辑:Linux編程
組合模式聽說去很玄乎,其實也並不復雜。為什麼?大家可以先想一下數據結構裡面的二叉樹是怎麼回事。為什麼就是這麼一個簡單的二叉樹節點既可能是葉節點,也可能是父節點?
  1. typedef struct _NODE
  2. {
  3. void* pData;
  4. struct _NODE* left;
  5. struct _NODE* right;
  6. }NODE;
那什麼時候是葉子節點,其實就是left、right為NULL的時候。那麼如果它們不是NULL呢,那麼很明顯此時它們已經是父節點了。那麼,我們的這個組合模式是怎麼一個情況呢?
  1. typedef struct _Object
  2. {
  3. struct _Object** ppObject;
  4. int number;
  5. void (*operate)(struct _Object* pObject);
  6. }Object;
就是這麼一個簡單的數據結構,是怎麼實現子節點和父節點的差別呢。比如說,現在我們需要對一個父節點的operate進行操作,此時的operate函數應該怎麼操作呢?
  1. void operate_of_parent(struct _Object* pObject)
  2. {
  3. int index;
  4. assert(NULL != pObject);
  5. assert(NULL != pObject->ppObject && 0 != pObject->number);
  6. for(index = 0; index < pObject->number; index ++)
  7. {
  8. pObject->ppObject[index]->operate(pObject->ppObject[index]);
  9. }
  10. }
當然,有了parent的operate,也有child的operate。至於是什麼操作,那就看自己是怎麼操作的了。
  1. void operate_of_child(struct _Object* pObject)
  2. {
  3. assert(NULL != pObject);
  4. printf("child node!\n");
  5. }
父節點也好,子節點也罷,一切的一切都是最後的應用。其實,用戶的調用也非常簡單,就這麼一個簡單的函數。
  1. void process(struct Object* pObject)
  2. {
  3. assert(NULL != pObject);
  4. pObject->operate(pObject);
  5. }
Copyright © Linux教程網 All Rights Reserved