设计模式是经常发上的设计问题的解决方案。模式描述了如何利用一组类来解决问题——换句话说,模式为您的系统的现有部分提供一个概括的蓝图。模式不包含算法,相反地,它关注于类之间的关系。通过使用设计模式,您能够利用已证实的导致更佳设计和更快实现的解决方案。设计模式还可以促进长期的代码维护。设计模式的基本目标是:
对于设计模式为什么重要的不同问题,考虑一个管理列表的简单实例。在计算机科学课程中,您曾学过不同类型的列表:数组、哈希影射、链表、堆栈、队列等等。如果您用 Java 程序设计语言编过程序,您就很有可能使用过 Collection 接口和它的一些子类。那么,您会了解到所有的列表均有一个基本的操作:迭代。您总是想要对列表进行迭代以得到其中存储的值。对于这样的一个任务,我会使用简单的设计模式,如 Iterator,它着重于迭代列表的一般方法,以避免每次要遍历列表时重复构造。用于迭代数组(相对于 LinkedList)的具体算法留给设计模式的实现部分。
Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides —— 叫作 Gang of Four,使模式普及起来。他们的著作《Design Patterns: Elements Of Reusable Object-Oriented Software》是软件架构师的必读书籍。书中定义了 23 种设计模式,所有的模式都包含于 Rational Software Architect 中。(要了解更多 Gang of Four 叙述的设计模式的信息,参见本文底部的参考资料。)现今,几乎每个大型的信息技术(information technology,IT)组织都采用了设计模式。Sun Microsystems 使用了许多设计模式,并将设计模式应用到 Java 和 Java 2 Platform Enterprise Edition (J2EE) 技术上。Server Side Web 站点是另一个很好的知识库,在其中,开发人员可以对设计模式做出贡献。
设计模式中的元素
设计模式由以下元素组成。您可以将此列表当作阅读或撰写设计模式的模板:
不论您是创建自己的模式,还是使用已经存在的模式,务必要密切地关注“适用性”部分。如果您在此部分中提供了足够的细节,那么其他用户将会很好地理解什么时候且如何使用您创建的设计模式。相反地,该部分将帮助您找到最适合具体设计问题的模式。
设计模式的类型
Rational Software Architect 包含所有 23 个 Gang of Four 模式。(但是,您还可以创建并添加自己的模式。)这些模式分成三个类别:
图 1 描述了一个每个类别之下的模式的完整列表。
图 1. Rational Software Architect 中的设计模式
本文介绍了如何在 Rational Software Architect 中实现三个基本的设计模式。本文的意图不是使您成为设计模式的专家,而是向您介绍 Rational Software Architect 所具有的模式功能。
Rational Software Architect 中的设计模式
Rational Software Architect(IBM Software Development Platform 的一部分)允许架构师设计并维护应用程序体系结构。 该工具建立在 Eclipse 之上,因此开发人员和架构师可以利用 Rational Software Architect 中 Eclipse 平台的可用特性。另外,该工具提供丰富的建模和体系结构设计及发现功能,超过典型的集成开发环境(IDE)所具有的特征。这是设计模式流行的原因。
注意:要了解更多关于 Eclipse 的信息,请参见参考资料部分。要了解更多关于 Rational Software Architect 的介绍信息,请参见我的文章“Introducing IBM Rational Software Architect:Improved usability makes software development easier”——也在参考资料部分。
为了展示在 Rational Software Architect 中使用设计模式是多么简单的一件事,我将描述一个名为Singleton 模式的简单模式。
注意:本文中我所讨论的模式是为进行普通任务而随机选择的。
Singleton 模式
如其名称所暗示的,当您想要特别类的仅仅一个实例时,才使用 Singleton 模式。例如,如果您想要为一些数据库操作生成单键,那么您可以使用此创建类模式 —— 在这种情况下,如果您想要一个用于返回这些键的类实例。在其他实例中,此模式也是有用的,包括登录和打印,例如,当您想要一个能够每次访问并控制一个特别打印机的类实例。
要想在 Rational Software Architect 中创建Singleton 模式的实例,就执行以下步骤。(在此实例中,我并没有针对其他与此模式相关的问题,如保持同步以确保线程安全。)
MySingleton
(参见图 2)。执行此操作将会在模型浏览器中生成一个Singleton 模式的实例。 _instance
。 getInstance()
。
图 2. 一个Singleton 模式的实例
|
注意:我将在本文的后部讨论该模式的实例化。要了解更多关于创建 UML 类图和 UML 到 Java 的转换的信息,请参看我的文章“Introducing IBM Rational Software Architect: Improved usability makes software development easier”(参见 参考资料)。
那是个简单的模式。现在,我将为您展示一个稍微复杂的模式。
Factory 方法模式
Factory 方法模式是一个创建的模式,它定义一个用来创建对象的接口,而让子类来决定实例化哪个类。 换句话说,Factory 方法令一个类实例化到其子类。当一个应用程序需要实例化一个未知类型的类时,此模式是很有用的。只有当应用程序实际上需要该类,而不是在编译或运行时过程中,此类的类型才成为显式的。接下来的实例更进一步地解释了此概念。
模式使用了两个类型的类:product 类和 creator 类。Creator 类用于定义创建产品对象实例的Factory 方法。product 和creator 类是抽象的。Concrete 类为它们各自的基类提供恰当的实现。Factory 方法模式由以下类组成:
要创建Factory 方法模式的实例,执行同Singleton 模式相同的步骤。图 3 显示了我创建的实例。在该实例中,模式由以下类组成:
图 3. 游戏 Factory 方法模式
注意:在您生成代码并检查之前,要知道您也需要为 Factory 方法模式添加适当的方法。
在此实例中,直到玩家选择为止,Game 类才知道什么时候实例化具体的游戏类。在那时,Game 类需要适当地创建 BasicGame 或 AdvancedGame 类的实例。这是个典型的Factory 方法模式实例。
该模式的另一个实例是图书馆。图书馆有许多文档,如书、手稿和杂志。如果您建立一个图书馆管理应用程序,直到用户将文档拿到图书管理员桌子上,您才知道用户要查看的文档类型。作为练习,尝试使用 Rational Software Architect 建立一个该模式的图书馆模型。
您已经看过了两个创建的模式,现在让我们看看如何在 Rational Software Architect 中使用动作类的模式。
责任链模式
责任链模式用于促进请求的发送者或创始人(客户机)和接收请求的系统之间的松耦合。您会在以下情况使用责任链模式:
该模式允许您链接响应请求的对象。客户机将请求实例化,并将其作为处理者实例的参数进行传递。具体的处理者实现了一个获得请求对象的操作,并为链中的下一个处理者维持一个参考标准。具体的处理者是从抽象的处理者扩展而来。该模型的元素是:
举一个批准过程的实例。在此情景下,客户机(在此情况下,公司的会计部分)提交用于批准的预算。预算需要经三个人批准:首席财政官(Chief Financial Officer,CFO)、首席操作官(Chief Operating Officer,COO),和首席执行官(Chief Executive Officer,CEO)。图 4 描述了该设计模式的一个简单实例。在此实例中,用到的类是:
图 4. 批准过程的责任链模式实例
作为另一个实例,考虑客户支持应用程序。当支持请求进入到 IT 部门,第一级支持团队将首先进行处理。根据对该请求的分析,他们可能需要将该请求发给第二或第三级支持人员。尝试在 Rational Software Architect 中使用责任链设计模式为该情境建模。
总结
设计模式是公共设计问题的可复用的解决方案。他们可以帮助您快速创建更易维护的软件。Gang of Four 所描述的 23 个设计模式包含于 Rational Software Architect 中,且您可以将这些模式拖拽到图表之上,并能如模式所描述地快速地设置您的类。Rational Software Architect 中的代码生成特性允许您生成基于这些模式的代码。此外,您还可以创建自己的模式,或实现其他人创建的模式。
在本文中,您见到了一些简单的模式,以及如何使用 Rational Software Architect 来实现这些模式。虽然我随机地选择了三个设计模式——Singleton 模式、Factory 方法模式,和责任链模式 —— 但我建议您用 Rational Software Architect 实现一两个其他的模式。您可以从结构类模式开始。另一个好的练习方法是在 Rational Software Architect 中实现您在一些 Web 站点上读到或见到的设计模式,如 TheServerSide.com 站点或从 Sun Blueprints 中。