2009年4月20日星期一

层模式的实现及管道过滤器模式初步

层模式的实现步骤:
1,定义分层标准,也就是需要一个准则,用它能把待开发的系统抽象出各个层来。这个准则很重要, 因为它觉得了层的划分和粒度。书中提到一个大概的准则,从上到下依次:User visible elements;Specific application modules;Common services level;Operating system interface level;Operating system 和 Hardware。
2,为各层命名并分配任务。
3,为各层指定服务(我这里疑惑的 是服务和第二点的任务有什么区别?)。书中提到最重要的实现原则是各层要严格地隔离开,杜绝跨层的组件。某个层中的函数和接口,它们的返回值,参数,错误 类型等等,都应该是某种语言的内建类型(例如int,float等)或者是在改层中定义的类型,或者是一个公共的数据类型。但是书中的意思是,使用公共的 数据类型会影响各个层之间的界限和划分,所以应该要少用。
服务要多放在上层,下层要保持苗条,少放服务。上层使用下层的服务,下层为上层提供服务。
4,重新分层,这是一个迭代的过程,因为在初始的划分中难免有错误和不合理的地方,例如某一层会使用多个层的服务,而不是只使用它的下一层的服务,这是违反层模式原则的。
5,为每层指定接口,这个接口是为了上层能够使用该层的服务。对上层来说,下层最好是像一个黑盒,上层不知道下层的实现,但上层知道下层提供的服务并可以使用这些服务。
6,考虑每层的结构,传统上,很大部分的精力都放在如何在层与层间建立更好的关系,但是单个层内部的结构也很重要,如果某一层非常复杂,那么可以将该层分为多个组件,并对这些组件应用设计模式。
7, 指定层间的通信,书中提到推拉模型,第J层调用第J-1层的服务,将所需要的信息通过调用传给J-1层,是为推模型;低层将信息返回给高层,是为拉模型。 推拉模型可以用Publisher-Subscriber模式,或者Pipes and Filters 模式来实现。
8,对相邻的层解耦,前一步提到了指定层间的通信,用推拉模型,不过这可能会造成相邻两层耦合度比较高,书中提到可以用接口和回调函数降低耦合度(不过我还是不明白为什么用回调就能解偶,我觉得回调函数和Publisher-Subscriber模式没什么区别)。
9,建立错误处理机制。

层 模式的变体,可以称为松散的层模式,松散层模式中,高层不但可以使用下一层的服务,也可以使用其它低层的服务。这样的好处是效率和可塑性,但这是以牺牲可 维护性为代价的。一般在系统软件中使用这种松散的层模式比较多,例如Unix,X Window等,因为这些系统一般比较稳定,不需要经常做大的修改,它们对效率的追求也比较高。

the Pipes and Filters pattern:
为 说明该模式,书中举了一个例子,假设有一个新的语言,类似Java,要为该语言开发编译器,编译器的处理过程就是一个数据流的处理过程,首先输入的是 ASCII码的文本,也就是用该语言编写的源文件,经过扫描,得到句元流(Token stream),经过语法分析,得到抽象语法树(abstract syntax tree),经过语义分析,得到argument abstract syntax tree(不知道怎么翻译),再经过中间码生成,得到中间码(和Java的字节码一个意思),最后经过优化,得到可在
特定CPU上执行的机器码指令。如下 图所示:

没有评论:

发表评论