2005年3月4日星期五

《ASD》设计模式:Observer

Observer模式稍稍有点复杂,但是由于他的作用如此强大,所以几乎在所有的带有分层概念的系统中都必须使用。
带有GUI的软件几乎都有分层的概念,界面是一层,逻辑实现是一层。所以他们也就成了最常见的Observer模式的例子。
不过Observer模式的用处要比单纯的GUI要宽广很多。Observer的应用环境是,有上下两层模块,下层模块的数据会自发变化,上层模块必须响应这样的变化,但是上层模块不知道下层模块会在什么时候变化。这种情况下就应该使用Observer模式,上层模块让下层模块知道自己的存在,然后在下层模块在变化的时候通知上层模块。
Observer模式的另一个比较有趣的别名是Hollywood模式,因为这个模式可以被描述为“Don't call me, I'll call you.”。
由于Observer如此的常用,所以在实际的使用过程中,这已经是一个烂熟于心的模式。《ASD》一书在讲述这个模式的时候,也没有多少新意,但是还让我有一些点滴的感想:

- Observer模式是典型的由DIP原则驱动的模式。无论是上层数据的变化还是界面的显示都是具体类。具体类应该是不稳定的,不能被依靠。所以必须抽象出接口,就是下层的Subject接口和上层的Observer接口。Subject接口依赖Observer接口。

- 根据单一职责原则(SRP)和接口分离原则(ISP),Subject应该只是处理register和notify的任务,而和具体逻辑无关。这在使用拉模式时尤其需要注意。

- Observer模式有推模式和拉模式两种方法。推模式中,由Subject把数据直接告诉Observer。在拉模式种,Subject只是告诉Observer有事情在变化,然后由Observer来查询是什么数据变化了。究竟使用何种模式应该视具体应用而定。然而常常是两个模式的混合运用。

- 在使用拉模式的时候,Observer要向下层询问获取数据。然而数据属于具体的业务逻辑,和Observer模式的框架无关。因此这个接口不应该被包含在Subject接口中,而需要设立一个单独的业务接口。也就是说,在这种情况下,下层模块要继承两个接口,Subject接口和自己的业务逻辑相关的接口。(如果不这么作,将会形成依赖环)

- 如果把推模式和拉模式混合使用,即是,Subject告诉Observer一个消息,提示是何种变化。Observer判断是否要查询更具体的数据,或者如何查询。这就是消息驱动系统了。

- 另外一种变化是,Observer在注册的时候,就表明自己对何种消息感兴趣。Subject在事件发生的时候,只是通知感兴趣的Observer。

2005年3月3日星期四

《ASD》设计模式:Composite

我对于Comosite模式有种特殊的感情,因为这是我第一个理解了的模式。之前看《设计模式》一直未能理解模式的意义,直到看到Comopiste,才觉得豁然开朗。之后再看其它模式,也觉得能够理解模式背后的意图了。

Composite模式其实是一种非常特别的模式,因为他所关注的是结构,而较少关注行为。这与大部分的设计模式是有所不同的。
可是,Composite模式的结构是非常精巧的,甚至可以称之为美丽动人。
元素合在一起组成了结构。结构可以和零散的元素或者别的结构再次组合,形成新的结构。这样的组合可以无穷尽地延续下去。
常常,我们需要的是最上层的整体。
Composite模式让我们可以在运行时期,用组合的方式来建造这样的整体。
Composite模式较少被误用。因为她的应用总是在特别的面向数据结构的上下文环境。而且也没有多少别的方法可以顶替Composite的作用。
Composite模式不太关注行为,即如何使用这个巨大组合结构中的元素。她本身只提供了很简单的深度优先的遍历方法。
如果有更高的行为上的要求,就要借助于另外两个模式:iterator和vistor。

迁徙的野鸭

今天早上去上班的时候,有两只类似野鸭的鸟从我头顶飞过。莫非春天来了,又到了候鸟们迁徙的时候了?
突然很想再看一次那部美轮美奂的电影《迁徙的鸟》。可惜身边没有碟片。而且这电影要在大屏幕上看才舒服。
《迁徙的鸟》中有大量的和候鸟们同步飞行的镜头,观看的时候,感觉自己也在和鸟儿们一同飞翔。当镜头跟着鸟群,在挣脱地面束缚的那一刹那,心中有种感动在暗涌。
候鸟的迁徙是非常伟大的。套用电影中的台词,迁徙的鸟是一个关于承诺的故事。
没有电影看,就只能贴张海报了。

See The Future. Make History.

今明两天,在Redmond有微软一年一届的TechFest。微软在全世界的六个研究院(Redmond,湾区,硅谷,剑桥,北京,印度)都会在这个TechFest上,展示自己一年来的成果。See the future. Makes history就是本届TechFest的口号。
TechFest在三个大会议室中,布置了很多摊位,每个摊位上都有一个技术展示。另外还有两个大会议室,用来作一小时一个的报告。
我今天去的稍晚了一点,到场的时候已经快要4:30PM了。没有去听报告,直接去展厅看技术展示。有很多展示都非常让人兴奋,花了一个半小时,只是马马虎虎地看完了一个展厅。剩下的两个展厅就已经关门了。
只能暗下决心,明天一定要早点去。
我拿不准今天看到的东西中,有多少是可以公开谈论的。所以只好不谈具体细节,只说说大致内容。
在今天这个展厅中,展示的技术,主要集中在系统与网络、软件工程、数据库、P2P方面。身为程序员,当然是软件工程方面的技术最有切身关系。有几个项目,和单元测试、源码数据挖掘、编程框架相关的,让我觉得特别的兴奋。真的是非常希望能够快点用上他们的成果。

2005年3月2日星期三

相声瓦舍

我用eMule下载了一些台湾相声瓦舍表演的相声段落。听了之后,觉得非常过瘾。
相声瓦舍中,最重要的两个表演者当属冯翊君和宋少卿二人。感觉上这两人的语言基本功依然不如大陆的一流相声演员,再表演报菜名这样的传统段子的时候,虽然还算精彩,但是就远不如大陆相声演员的神乎其技。
可是谁喜欢看一个人站在台上口沫四溅的念绕口令?

相声瓦舍最让人觉得过瘾的是他们的讽刺态度。讽刺时政,也讽刺不良的国民性。例如《相声说跨鬼子》系列,听来实在过瘾。
然而有些段子,虽然没有太强烈的讽刺意味,例如《战国厕》,但是想像之丰富,也是大陆的相声中所见不到的。
在创作的时候,束手束脚,这也不能,那也不能,久而久之,连正常的想像力也都没有了。大陆的相声创作大概就是如此。

之前,听过一个一米线的理论。
大意是说,有一个限制在那里,谁都知道不能跨过那根线,否则就很糟糕了。
可是这样是不够的。编辑还很担心,自己会失手放过什么过界的东西吗。所以编辑会在那个限制之前,退出一米再划根线。
然后是作者。他们会在编辑的那根线之前,再退出一米,再划一根线。
可实际上,并不只有这三根线。
因为所有的人都不确定自己的那根线是否划对了。看到别人的线好像更远一点,自己也就再退一点。
于是你退一米,我退一米。那根线就越退越远了。
真正的问题不是在于那根线在哪里,而是在于有那么一根线,人就失去了一种自由的能力。
这就是所谓的精神阉割。

所以,听听相声瓦舍,听听没有被阉割过的声音,真的很过瘾啊。