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

作者: H45 (!H45)   2016-09-28 14:59:37
※ 引述《henry8168 (番薯猴)》之銘言:
: ※ [本文轉錄自 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將奉上給第一位解答者,感激不盡
不同的作業系統和機型很可能需要不同的程式碼來實作某個很底層的功能,尤其是這功能
和作業系統或機型本身有非常強的關聯性的時候,幾乎不可能用一樣的程式碼做一樣的事
情。
在這種情況之下,用 if else 來區分環境是不可避免的,但是必須考慮這樣的 if else
不應出現在程式碼太多次,理想的情況下,應只出現一次。
舉例來說,如果有兩個底層的功能都需要判斷作業系統和機型來決定要如何實作,是否這
兩個功能都要寫一樣的 if else 流程控制結構呢?
那如果有三個,或三個以上底層的功能呢?
或許,這樣的 if else 只需要出現一次。
我不敢說自己是什麼專家,但如果是我來做,我會用下面的方式
// initialize object depending on ios and iphone
if (IS_OS_5_OR_LATER) {
// create object in type ios5
}
else if (IS_OS_6_OR_LATER) {
if (IS_IPHONE5) {
// create object in type ios6_for_iphone5
}
else {
// create object in type ios6
}
}
else if (IS_OS_7_OR_LATER) {
if (IS_IPHONE5) {
// create object in type ios7_for_iphone5
}
else {
// create object in type ios7
}
}
// call func1
object->func1()
// call func2
object->func2()
這樣的做法,只須在創造物件時判斷作業系統和機型版本
無須在 func1() 和 func2() 內再判斷一次
個人認為,這和責任鏈、組合模式沒有關係。

Links booklink

Contact Us: admin [ a t ] ucptt.com