代码改变世界

模式对话录 之一 模式到底是个啥玩意?

2009-02-28 12:44  ilclr  阅读(1275)  评论(6编辑  收藏  举报

题目有点大,也写不了什么东西,一没精神头,二没时间,三没耐心,因为懒。只是把自己知道的拿出来一个框架供大家作为讨论的引子,共同进步。

整个思路以一问一答的形式出现(假设问的人叫A,答的人叫B。深受某个书内容编排方式的影响),一步一步追踪下去直到追不到为止(能力有限,请各位包含),在追问过程中引入设计模式的来龙去脉。


Lets go......................... 


A:你会模式吗?

B:of course,it's easy!!!!

A:easy?cool!那我问你几个问题,正好我不熟悉,嘿嘿。

B:OK!!!!!你问吧。

A:很多地方写到模式分为三类,分别是创建型、结构型、行为型。你有想过模式为什么要这么分吗?

B:想过。创建、结构和行为三种分类正好体现了一个生命周期的过程。

A:生命周期的过程?what's meaning of that?

B:其实很容易理解----我们做的系统,都是有了请求才有响应,否则我们的系统堪比变形金刚了。既然请求要响应,就需要有对象去响应具体的请求,所以我们要创建这个对象。 创建完了之后还要通过调用其方法来使用对象的行为去响应具体的请求。最后当行为在某些情况下无法满足需求的时候,我们需要调整对象内部或者和外埠世界的结构来重新满足请求的响应。

A: 有点抽象!不过你说的三个分类体现了一个对象的生命周期我还是头一次听说。但我对模式的分类和对象的生命周期阶段的具体对应方式还是感觉很模糊。帮人帮到底,如果这个方面有研究能继续讲解一下吗?

B:OK,其实也不是什么难东西,惟手熟尔.....

B:因为要响应请求,所以需要有一个对象去担负这个职责,所以我们才要去创建这个对象。到此第一个生命周期阶段(创建阶段)出现了。创建完成之后,我们要使用对象的方法来表现对象的行为,OK,第二阶段(行为阶段)出现了。当然,未必是最后,当我们发现对象的行为还无法满足请求的时候,我们需要改变对象的内部或者外埠结构,Here,第三个阶段(结构修改阶段)出现了。

B:一个对象从创建到消亡都或多或少的会经历这三个阶段,在这三个阶段中,为了控制改变的类型朝着扩展的方向去走,而不是朝着修改的方向去走,我们使用模式来达到这个方向控制的目的。说白了,也就是通过模式来在这三个阶段控制开闭原则OCP的实现。

A: OCP我听说过,也很好理解。但我感觉你还是没有说到我想象中的那个点子上?你口口声声说模式是在一个响应请求的对象的生命周期的三个阶段去控制OCP的实现。但具体怎么控制并没有说啊?能否继续一下呢?

B:小样,继续有啥难的,听好了!

B:我不说GOF的那些模式都咋实现的(能力有限,说不清楚),但所有的模式都有一个共同点,那就是充分利用了OO中的三大特征之一的多态,实现了功能的分离。通过多态功能分离可以轻松地实现包装变化点。然后把对象生命周期中三个阶段的变化点直接打包进通过多态实现的封装变化点模块中。最后形成的结构就是通过在请求和响应之间加入一个代理----代理层负责封装变化点----来分离原先直接架在响应和请求之间的耦合来达到解耦的目的。所以解耦这个词并非表示耦合不存在了,仅此表示耦合度被降低了。(刚才西南方有位大仙给我指了迷津,告诉我彻底解耦必须用reflection技术,因为刚学C#,还不甚了解,等彻底了解了再上来卖弄也不迟.....)

A:待我想想!.....

A:好像是有点感觉。今天先问到这里,改天有时间继续请教。

B:好的,有时间多聊,正好也帮我复习巩固巩固,回见,给儿子洗屁股去了..............................

 

总结:因为有请求,所以有响应

        因为有响应,所以有响应对象

        因为有对象,所以要创建对象

        因为创建了对象,所以要使用对象的行为

        因为对象的行为可能满足不了请求,所以需要改变对象的内或外部结构

        创建、行为和结构三个阶段正好组合了对象的生命周期

        因为地球人都讲OO,所以要保证上述三阶段中可能发生的改变必须是扩展,所以有了模式

        模式说白就是月老(媒婆的雅称)----原先牛郎和织女一个电话就了的事情,现在必须先由牛郎给月老一个电话,然后由月老代理牛郎和织女联系后续事宜。不过也好,万一织女哪一天用的脸霜质量有问题,搞的满脸疙瘩,起码有月老在中间挡着,牛郎眼不见心不烦.....

        所以说,耦合并没有因为模式的出现而消失,仅仅是被分解了!


下集预告《模式对话录 之 学习模式的一些前提概念》 

播出时间:不详!


using System.Threading;

...

Thread thread = new Thread(new ThreadStart(ReceiveBricks)) ;

thread.start();

...