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

看板OOAD作者 (番薯猴)時間7年前 (2016/09/26 22:34), 7年前編輯推噓2(2019)
留言21則, 4人參與, 最新討論串1/2 (看更多)
※ [本文轉錄自 C_and_CPP 看板 #1NwFzdvb ] 作者: henry8168 (番薯猴) 看板: C_and_CPP 標題: [問題] 組合模式(Composite Pattern)到底是什麼 時間: Mon Sep 26 18:58:41 2016 在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

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 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: henry8168 (58.115.109.218), 09/26/2016 22:34:10 ※ 編輯: henry8168 (58.115.109.218), 09/26/2016 22:40:10

09/27 00:45, , 19F
FB下面留言中的責任鍊才是對的,把每個if區塊分到
09/27 00:45, 19F

09/27 00:45, , 20F
責任鍊中的每個物件裡面去做
09/27 00:45, 20F

09/27 00:46, , 21F
然後一開始的if的地方則把責任鍊組起來使用
09/27 00:46, 21F

09/27 00:46, , 22F
關鍵字: Chain of Responsibility
09/27 00:46, 22F

09/27 03:24, , 23F
主要是它這程式細節不夠,很難知道每一塊
09/27 03:24, 23F

09/27 03:24, , 24F
if (IS_IPHONE5) { ... } 內部是不是做一樣的事。
09/27 03:24, 24F

09/27 03:28, , 25F
還有條件式的 IS_OS_5_OR_LATER 不成立的話,為何
09/27 03:28, 25F

09/27 03:29, , 26F
IS_OS_6_OR_LATER 又會成立?這部分得交代清楚,
09/27 03:29, 26F

09/27 03:29, , 27F
才比較容易想像這段程式原本到底是要幹嘛...
09/27 03:29, 27F

09/27 03:30, , 28F
從直覺上會以為是 if(ver >= 5) 不成立又去檢查
09/27 03:30, 28F

09/27 03:31, , 29F
else if (ver >= 6) {...} else if (ver >= 7) ...
09/27 03:31, 29F

09/27 03:32, , 30F
我沒寫過 iOS 的東西所以不能判斷 IS_OS_5_OR_LATER
09/27 03:32, 30F

09/27 03:33, , 31F
到底是不是我想的這樣,如果是,那這段程式會是更加
09/27 03:33, 31F

09/27 03:33, , 32F
離譜的智障寫法,連 pattern 都不需要討論 XD
09/27 03:33, 32F

09/27 03:37, , 33F
至於說這文章是本板的範疇,是因為文章主旨是在詢問
09/27 03:37, 33F

09/27 03:37, , 34F
什麼叫 composite pattern
09/27 03:37, 34F

09/27 10:50, , 35F
職責鍊是另一個模式吧, 跟組合模式有啥關係
09/27 10:50, 35F

09/30 19:51, , 36F
根本不會和composite pattern 有關。要解決這類問題
09/30 19:51, 36F

09/30 19:51, , 37F
通常是strategy 和/或 abstract factory
09/30 19:51, 37F

09/30 19:53, , 38F
責任鏈也不太對(硬來還是可以用可是責任鏈解決的
09/30 19:53, 38F

09/30 19:53, , 39F
應該不是這類問題)
09/30 19:53, 39F
文章代碼(AID): #1NwJ7Z1Q (OOAD)
文章代碼(AID): #1NwJ7Z1Q (OOAD)