歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

組合模式聽說去很玄乎,其實也並不復雜。為什麼?大家可以先想一下數據結構裡面的二叉樹是怎麼回事。為什麼就是這麼一個簡單的二叉樹節點既可能是葉節點,也可能是父節點?
  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.   
  7. }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.   
  7.     for(index = 0; index < pObject->number; index ++)  
  8.     {  
  9.         pObject->ppObject[index]->operate(pObject->ppObject[index]);  
  10.     }  
  11. }     
    當然,有了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