Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

在GoF模式以外(1)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  写这篇文章的时候,我考虑这个题目考虑了很久。我想在这篇文章中介绍的模式是在著名的Gang of Four的那本著名的<<设计模式>>以外的模式。本来准备给这篇文章取名叫做“超越GoF”,或者"不仅仅是GoF"。但是想来想去,这样的标题也许太过了,因为GoF不仅仅是介绍了几个设计模式,而且开创了一个模式的时代。后面的模式仅仅是一个模仿或者学习的结果而谈不上对他们的超越。所以,还是取了这个标题名<<在GoF模式以外的>>,看起来平实一些。

  Gang of Four的<<设计模式>>可谓经典作品,无论是程序员,还是设计人员或者项目管理人员,都能从中受益匪浅。我想说的是,中文版的翻译可以说是国内翻译作品中的精品,但是,如果要想理解原版中的细微语义,我还是向大家推荐原版,如果有可能买到原版的话。因为我对比过中文版本和原版,原版更清楚的表达了作者的意图。

  在Gang of Four的<<设计模式>>于1995年出版后,在软件行业掀起了一股变革的热潮,凡是在面向对象程序领域的程序员,体系设计人员都以设计模式为一个标准和有力的工具。后来也出了很多书,被称为Patterns系列。在USENET上,也有一个comp.object是讨论patterns的。还有GoF的Patterns主页:www.hillside.net也是Patterns使用者常需要访问的地方。

  我在这篇文章中,所想要介绍的,是在GoF的设计模式以外的模式,因为GoF书中介绍的是一些通用的,没有行业背景的模式,而在各个不同的领域,也分别有一些不同的设计模式,比如在通信领域,或者制造行业等等都有一些经验的积累,而这些积累则成为了多种多样的设计模式。我在本文中将要讲述的,是在电子商务领域和J2EE环境下的设计模式。在本文的结尾,将列出一些Patterns的网上信息。

  考虑一个租借电影的例子。每一部电影都有不同的描述,比如,imdb.com中描述Spider Man,


Directed by
Sam Raimi 
Writing credits (WGA)
Stan Lee (comic book) and
Steve Ditko (comic book) 
Genre: Action / Fantasy / Sci-Fi / Adventure / Romance / Thriller (more)
Tagline: With great power comes great responsibility. (more)
Cast overview, first billed only: 
Tobey Maguire .... Peter Parker/Spider-Man 
Willem Dafoe .... Norman Osborn/The Green Goblin 
Kirsten Dunst .... Mary Jane "M.J." Watson 
  (more) 

  而对于X-files,


"X Files, The" (1993)
[TV-Series: 1993-2002]
Directed by
Gillian Anderson 
Cliff Bole 
  (more)
Writing credits
David Amann (I) (writer) (episodes "Agua Mala", "Rush",
"Chimera", "Hell Bound")
  (more)
Tagline: The Truth is Out There (more)
Plot Outline: Two FBI agents, Fox Mulder the believer and Dana
Scully the skeptic investigate the strange and unexplained while 
hidden forces work to impede their efforts. (more) (view trailer)
User Comments: It's been a great ride. (more)

  可以看到,对于不同的电影,有不同的描述字段。再举一个,在员工档案里面,往往我们可以看到这样的例子:我的一般信息是这样的:


 First Name ***
 Last Name *** 
 Preferred First Name ***
 Preferred Last Name *** 
 Company ***
 Email ***
 UserID *** 
 Title Data warehouse architect
 Phone ***
 Fax ***
 MailDrop NA
 Location ***
 Commerce ID *** 
 Department ***
 Manager *** 
 Show Picture? TRUE 
 Company Code.Department ***
 Oracle Location ***
 Sync Data ORION 

  而CEO的一般信息是这样的:


 First Name *** 
 Last Name *** 
 Preferred First Name *** 
 Company *** 
 Email *** 
 UserID *** 
 Title President & CEO 
 Phone *** 
 Pager *** 
 Cell Phone *** 
 MailDrop ***
 Location ***
 Commerce ID *** 
 Department ***
 Initials ***
 Show Picture? TRUE 

  我在这里把所有的个人信息都用***代替了。可以看到,我的一般信息中,有一个Manager字段来描述我的头儿,而CEO则没有。在CEO的一般信息中,有Pager, Cell Phone,Initials等信息,而我则没有。对于这样的描述信息,如果我们需要用一个类来表示的话,该怎么做呢?这就是我要介绍的一种模式,叫做属性容器的模式。先说明需求。我们需要有一个类,能够表示动态的属性表,能够添加,删除各种属性。一个不好的设计需要当属性表变化的时候重新编译程序,这当然不是我们所希望的。属性容器模式,能够让我们动态的扩展一个对象,在运行时刻增加新的属性,而不需要重新编译代码。

  在下面这个UML类图中,可以看到,我们创建了一个非常简单的属性容器Interface和一个抽象实现:

  你也可以看到,有4个方法可以在属性容器中添加,删除,查询属性。这些属性由String类型的key来表示。在具体实现中我们简单的使用一个哈西表来存储这些属性。

  我们可以用这个非常简单的属性容器模式来完成工作,但是,也要注意到,实际应用中的模式有一些关键的扩展部分。这些扩展部分说明了模式能够以一种更加强壮和可扩展的方式实现。举例来说,如果一个对象是在一组有层次结构的对象中,属性容器模式能够实现运行时刻的对象遍历。

  用一个例子来说明吧。我们的例子是一个运行时刻的层次结构,这个结构描述了一个部门包含另一个部门的关系,并且这些部门都包含在一个公司内。动态查询一个部门信息的代码将会用到这个有层次结构的属性容器模式。该模式定义了遍历包含层次结构的代码。让我们来看一看代码:

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:一个Message-Driven Bean的示例   下一篇:容器管理持续化示例

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号