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