作者henry8168 (番薯猴)
看板OOAD
标题Fw: [问题] 组合模式(Composite Pattern)到底是什麽
时间Mon Sep 26 22:34:10 2016
※ [本文转录自 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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1474887527.A.E65.html
1F:→ chuegou: 合成? 09/26 19:01
好像也有称作合成模式的
2F:→ Caesar08: 请善用TMP 09/26 19:24
TMP是...?
3F:→ pttworld: later的考虑switch case的fallthrough,要很小心。 09/26 19:32
组合模式就是改成switch吗?
※ 编辑: henry8168 (58.115.109.218), 09/26/2016 20:16:55
4F:→ Caesar08: Template MetaProgramming的简称 09/26 20:59
5F:→ tinlans: 让全部的东西继承同一个 base,然後串成树状结构而已。 09/26 21:37
6F:→ tinlans: compiler 的 AST 那类东西一般都能用这种结构做 09/26 21:37
7F:→ bluesoul: 直觉想到是多型或是责任链 09/26 21:42
8F:→ tinlans: 至於为什麽这东西可以解那问题,我也想不透 XD 09/26 21:43
9F:→ bluesoul: 合成模式应该是用来表达层状结构的 09/26 21:44
10F:→ tinlans: 这鬼东西,一般的 factory + strategy 和基本多型概念 09/26 21:46
11F:→ tinlans: 就可以解了,FB 那下面不知道在反串什麽 09/26 21:47
12F:→ bluesoul: 我也觉得用错pattern 09/26 21:50
13F:→ tinlans: 不然就是那个「组合模式」是其它英文的中译 09/26 21:51
14F:→ tinlans: 还有其实这算 OOAD 板的范围,那边板主很伤心 XD 09/26 21:52
15F:→ ilikekotomi: 原来有OOAD板!! 等等去看一下 09/26 22:08
16F:→ descent: 你直接请他给一个 sample code 就好了。 09/26 22:09
17F:→ descent: 是不是嘴炮马上就知道了。 09/26 22:09
18F:→ descent: 解决这问题哪是这麽简单劳一句话就好。 09/26 22:10
我转到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
19F:推 mars90226 : FB下面留言中的责任链才是对的,把每个if区块分到 09/27 00:45
20F:→ mars90226 : 责任链中的每个物件里面去做 09/27 00:45
21F:→ mars90226 : 然後一开始的if的地方则把责任链组起来使用 09/27 00:46
22F:→ mars90226 : 关键字: Chain of Responsibility 09/27 00:46
23F:→ tinlans : 主要是它这程式细节不够,很难知道每一块 09/27 03:24
24F:→ tinlans : if (IS_IPHONE5) { ... } 内部是不是做一样的事。 09/27 03:24
25F:→ tinlans : 还有条件式的 IS_OS_5_OR_LATER 不成立的话,为何 09/27 03:28
26F:→ tinlans : IS_OS_6_OR_LATER 又会成立?这部分得交代清楚, 09/27 03:29
27F:→ tinlans : 才比较容易想像这段程式原本到底是要干嘛... 09/27 03:29
28F:→ tinlans : 从直觉上会以为是 if(ver >= 5) 不成立又去检查 09/27 03:30
29F:→ tinlans : else if (ver >= 6) {...} else if (ver >= 7) ... 09/27 03:31
30F:→ tinlans : 我没写过 iOS 的东西所以不能判断 IS_OS_5_OR_LATER 09/27 03:32
31F:→ tinlans : 到底是不是我想的这样,如果是,那这段程式会是更加 09/27 03:33
32F:→ tinlans : 离谱的智障写法,连 pattern 都不需要讨论 XD 09/27 03:33
33F:→ tinlans : 至於说这文章是本板的范畴,是因为文章主旨是在询问 09/27 03:37
34F:→ tinlans : 什麽叫 composite pattern 09/27 03:37
35F:推 yzfr6 : 职责链是另一个模式吧, 跟组合模式有啥关系 09/27 10:50
36F:→ adrianshum : 根本不会和composite pattern 有关。要解决这类问题 09/30 19:51
37F:→ adrianshum : 通常是strategy 和/或 abstract factory 09/30 19:51
38F:→ adrianshum : 责任链也不太对(硬来还是可以用可是责任链解决的 09/30 19:53
39F:→ adrianshum : 应该不是这类问题) 09/30 19:53