回飛鷹:Design pattern一點初探

來源: 澳洲老土 2009-01-26 18:56:00 [] [舊帖] [給我悄悄話] 本文已被閱讀: 次 (3014 bytes)
本文內容已被 [ 澳洲老土 ] 在 2009-01-30 23:46:59 編輯過。如有問題,請報告版主或論壇管理刪除.
最新一直在revisit近幾年做過的project,想把它們都歸到一個architect的角度來思索,就有了如下的一些感想,有很多還很不成熟,隻是個人的一些見解,歡迎批評糾正:

1. Foundamental Principles( 從高到底)

The Open/Closed Principle(OCP)-> The Dependency-Inversion Principle (DIP)->patterns(most of them)->individual projects

Ocp是絕對基礎,但沒有dip給出的具體實在, 絕大多數patterns是dip的implement,而具體的projects是某個pattern的implement.

還有幾個相關的priciples,但都是ocp的constraints,很好,但沒有dip那麽重要。

思維活躍的group很注重pattern的應用,他們不一定注重某個pattern的考察,但如果對dip理解不深,說輕了是沒有真正的掌握patterns,說重了是components之間的reference都不對,software的architecture就是錯的,很要命。

所以理解dip是第一步。

2.Patterns的目的和手段.

Patterns的目的是為了應對變化,使software more scalable. OO中應付變化的手段就是abstraction,而不是具體的class. Depend on abstraction是dip的精髓。所以絕大多數patterns都是針對abstraction編程,來應對將來的變化。

3.組合or 繼承 ?

大框架來說基本上是組合,細分了才是繼承。這和90年代的oo有很大的不同。

4.分類

個人覺得傳統的分類方式Creational/Structural/Behavioral這種分類狠別扭, 也不利於掌握, 俺個人對他們進行”縱橫分類”.

如果把class的看成一個以base class(interface,abstract)看成是一個tree的話,那麽n個base classes就可以看成N個tree.

所謂橫分類就是有多個tree參與。縱分類就是隻有一個tree參與。

全部縱橫分類都是大組合小繼承。

橫分類代表多個方向的變化,縱分類代表一個方向的變化。

隸屬橫分類的patterns有:
Bridge:這個pattern很不被人強調,應用也不是那麽廣,但它反映N個方向獨立變化的思想,這正是組合的精髓,所以俺把它列為橫分類的基礎。

Abstract factory, builder, factory: 他們同屬creational patterns但就是以不同的方式new instance.

Mediator: 簡單,不說了。

縱分類的patterns:

Singleton: 最簡單的一個,沒有subclass.
Composite:用到collection 和 recursion.
Proxy: 代表這種分類思想的精髓,很多pattern都是從它延伸出去的。
Decorator: 雖然不常用,但思想精妙,tree 最右邊branch可以擴展到無窮深,隻要你願意。
Chain of Responsibility:同porxy一樣,經典。

state, strategy,template:簡單的abstraction的應用,不多說,但他們是應用最廣泛的一類。

還有一類是通過.net現有的type都可以實現的:
Prototy: 用clone.
Command, observer: 用delegate or event.
Iterator: 用generic collection

另一類通過warper實現:fa231;ade, adapter.

剩下的就是很少用到的,起碼我很少那樣考慮:interpreter, visitor.

patterns很多都相互包含,隻要有對其中幾個比較精髓的pattern理解深刻,其他同類的就會迎刃而解。

5.對patterns地掌握需要正反兩個互逆的過程,第一個過程是用一個pattern來找issue嚐試解決,這是學習的過程。逆過程就是拿問題來用pattern解決,這是應用的過程,也是終極目標。很多developer始終停留在第一個過程,很可惜。

6.在開發的過程中premature abstraction也是一個很大的問題,會導致不必要的performance的喪失,所以BA的過程就顯得尤其重要, 但到最後需求的變化也不可避免,這時候就要有擁抱變化的樂觀態度了。

所有跟帖: 

80%看8懂 -快笨死了- 給 快笨死了 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:02:59

80%看懂了,你就要改ID了:) -wxc369- 給 wxc369 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:05:04

改-快聰明死了 -快笨死了- 給 快笨死了 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:07:41

聰明人要挨板轉滴,別改~~//出去啦,回見 -澳洲老土- 給 澳洲老土 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:18:54

誰把論文貼這兒了?要晉“高級灌水員”? -龍少爺- 給 龍少爺 發送悄悄話 龍少爺 的博客首頁 (0 bytes) () 01/26/2009 postreply 19:10:24

哈哈,密謀準備篡權拉~~ -澳洲老土- 給 澳洲老土 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:17:41

論文題目 "我在那革命的新年裏" :) -techy- 給 techy 發送悄悄話 (0 bytes) () 01/26/2009 postreply 19:49:57

好題目~~ -澳洲老土- 給 澳洲老土 發送悄悄話 (0 bytes) () 01/26/2009 postreply 20:23:28

寫的好,現在才知道,原來回字有6種寫法 -胡說之- 給 胡說之 發送悄悄話 胡說之 的博客首頁 (15 bytes) () 01/26/2009 postreply 20:11:37

happy new year~~ 胡主席!! -澳洲老土- 給 澳洲老土 發送悄悄話 (0 bytes) () 01/26/2009 postreply 20:22:23

回澳土,你咋也悶上這個了?跟飛鷹學玩酷,玩這個? -mdq100- 給 mdq100 發送悄悄話 mdq100 的博客首頁 (344 bytes) () 01/26/2009 postreply 21:02:45

嗯,等你把architecture framework弄出來了,俺好好跟你學習學習! -澳洲老土- 給 澳洲老土 發送悄悄話 (33 bytes) () 01/26/2009 postreply 21:12:20

"Mine is grander than yours, but I ain't got nothin' to show yet -被封過一回- 給 被封過一回 發送悄悄話 (0 bytes) () 01/27/2009 postreply 07:23:37

本壇真正懂pattern的第一人,鼓勵! -全信書- 給 全信書 發送悄悄話 全信書 的博客首頁 (114 bytes) () 01/27/2009 postreply 08:22:34

謝謝~~,您老人家別總潛水阿,we miss u~~ -澳洲老土- 給 澳洲老土 發送悄悄話 (0 bytes) () 01/27/2009 postreply 13:15:34

strategy is OCP's 具體實在 -ncpga- 給 ncpga 發送悄悄話 (0 bytes) () 01/27/2009 postreply 13:33:57

哎呀,你真牛也!我一個字看不懂:) -戲雨飛鷹- 給 戲雨飛鷹 發送悄悄話 戲雨飛鷹 的博客首頁 (20 bytes) () 01/27/2009 postreply 16:02:42

請您先登陸,再發跟帖!

發現Adblock插件

如要繼續瀏覽
請支持本站 請務必在本站關閉/移除任何Adblock

關閉Adblock後 請點擊

請參考如何關閉Adblock/Adblock plus

安裝Adblock plus用戶請點擊瀏覽器圖標
選擇“Disable on www.wenxuecity.com”

安裝Adblock用戶請點擊圖標
選擇“don't run on pages on this domain”