回飞鹰:Design pattern一点初探

本文内容已被 [ 澳洲老土 ] 在 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

请您先登陆,再发跟帖!