[問題] 組合模式(Composite Pattern)到底是什麼

看板C_and_CPP作者 (番薯猴)時間7年前 (2016/09/26 18:58), 7年前編輯推噓1(1032)
留言33則, 8人參與, 最新討論串1/1
在FB的靠北工程師看到一篇文 https://goo.gl/u8dTYM 這種語法確實很冗長,然後看到留言有一個回覆說要善用組合模式。 我就很好奇組合模式是什麼,Google了一下,找到這4份網頁, http://www.one-tab.com/page/CRw70YIPR0Ky9az36aOG8Q 每一個都提到leaf、add、remove,但有看沒有懂, 請問有高手能解釋一下組合模式什麼概念嗎? 套用組合模式後,靠北工程師的那份Code又會變成怎樣的? 希望能夠讓我聽懂,200P將奉上給第一位解答者,感激不盡 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.115.109.218 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1474887527.A.E65.html

09/26 19:01, , 1F
合成?
09/26 19:01, 1F
好像也有稱作合成模式的

09/26 19:24, , 2F
請善用TMP
09/26 19:24, 2F
TMP是...?

09/26 19:32, , 3F
later的考慮switch case的fallthrough,要很小心。
09/26 19:32, 3F
組合模式就是改成switch嗎? ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 20:16:55

09/26 20:59, , 4F
Template MetaProgramming的簡稱
09/26 20:59, 4F

09/26 21:37, , 5F
讓全部的東西繼承同一個 base,然後串成樹狀結構而已。
09/26 21:37, 5F

09/26 21:37, , 6F
compiler 的 AST 那類東西一般都能用這種結構做
09/26 21:37, 6F
感恩,P幣已送出。繼續討論吧

09/26 21:42, , 7F
直覺想到是多型或是責任鏈
09/26 21:42, 7F

09/26 21:43, , 8F
至於為什麼這東西可以解那問題,我也想不透 XD
09/26 21:43, 8F

09/26 21:44, , 9F
合成模式應該是用來表達層狀結構的
09/26 21:44, 9F

09/26 21:46, , 10F
這鬼東西,一般的 factory + strategy 和基本多型概念
09/26 21:46, 10F

09/26 21:47, , 11F
就可以解了,FB 那下面不知道在反串什麼
09/26 21:47, 11F

09/26 21:50, , 12F
我也覺得用錯pattern
09/26 21:50, 12F

09/26 21:51, , 13F
不然就是那個「組合模式」是其它英文的中譯
09/26 21:51, 13F

09/26 21:52, , 14F
還有其實這算 OOAD 板的範圍,那邊板主很傷心 XD
09/26 21:52, 14F

09/26 22:08, , 15F
原來有OOAD板!! 等等去看一下
09/26 22:08, 15F

09/26 22:09, , 16F
你直接請他給一個 sample code 就好了。
09/26 22:09, 16F

09/26 22:09, , 17F
是不是嘴炮馬上就知道了。
09/26 22:09, 17F

09/26 22:10, , 18F
解決這問題哪是這麼簡單勞一句話就好。
09/26 22:10, 18F
我轉到OOAD板一起問好了,合成模式我查到的也都是樹狀結構相關的東西, 可能是那留言在嘴砲吧XD" 所以那一連串的if else的code,還有不同寫法讓版面繼續縮減嗎? ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:33:18 ※ henry8168:轉錄至看板 OOAD 09/26 22:34

09/26 22:34, , 19F
...時間複雜度???
09/26 22:34, 19F
就讓電腦可以比較有效率判斷執行版本的寫法,不用一個一個詢問 @@" ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:35:36

09/26 22:38, , 20F
時間複雜度 這個詞通常用在演算法分析
09/26 22:38, 20F
抱歉,已修改 ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:39:39

09/26 22:40, , 21F
我是不知道那個方法寫起來最好維護,但TMP肯定執行最快
09/26 22:40, 21F
我正在看https://goo.gl/vrD71Y 看不太懂 enum { value = N * Factorial<N - 1>::value }; 和一般enum不太一樣?

09/26 22:46, , 22F
如果要快請參考map/hash + factory/command
09/26 22:46, 22F

09/26 22:47, , 23F
只用過hash map,還在研究factory/command, 然後switch好像比較被推來取代if else? ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 23:16:14

09/26 23:16, , 24F
怎樣看都不是composite pattern啊 decorator還比較有
09/26 23:16, 24F

09/26 23:16, , 25F
可能吧 而且原本的if就有問題了吧....
09/26 23:16, 25F

09/26 23:18, , 26F
一樣
09/26 23:18, 26F
我看懂了,原來是template的進階應用XDD,感恩 ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 23:26:28

09/27 03:39, , 27F
我比較疑惑的點是,如果 IS_OS_5_OR_LATER 等價於
09/27 03:39, 27F

09/27 03:39, , 28F
ver >= 5 的話,那後面的一大串 else if 到底在幹嘛 XD
09/27 03:39, 28F

09/27 03:40, , 29F
FB 沒交代清楚這點,可能要寫過 iOS 程式的會知道吧。
09/27 03:40, 29F

09/27 03:40, , 30F
真的等價的話,else 之後判斷 ver < 4 的範圍才有意義。
09/27 03:40, 30F

09/27 03:41, , 31F
所以我在想,他講的智障是不是更基本層面的問題..
09/27 03:41, 31F

09/27 06:53, , 32F
如果不同人不同時期維護同一段程式是有可能的。
09/27 06:53, 32F

09/27 06:54, , 33F
不敢動邏輯寧可再開一條線出來,copy&paste來改。
09/27 06:54, 33F
文章代碼(AID): #1NwFzdvb (C_and_CPP)