本文向您介绍设计模式的基础,并解释了 IBM Rational Software Architect
如何促进基于设计模式的开发。文中还介绍了一些关于设计模式的实例,并告诉您如何快速地建立类图及生成基于这些模式的代码。后继的文章将更详细地阐述本介绍性文章中所涵盖的内容。
设计模式是经常发上的设计问题的解决方案。模式描述了如何利用一组类来解决问题——换句话说,模式为您的系统的现有部分提供一个概括的蓝图。模式不包含算法,相反地,它关注于类之间的关系。通过使用设计模式,您能够利用已证实的导致更佳设计和更快实现的解决方案。设计模式还可以促进长期的代码维护。设计模式的基本目标是:
对于设计模式为什么重要的不同问题,考虑一个管理列表的简单实例。在计算机科学课程中,您曾学过不同类型的列表:数组、哈希影射、链表、堆栈、队列等等。如果您用
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 中。现今,几乎每个大型的信息技术(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 中的设计模式](images/figure121.jpg)
本文介绍了如何在 Rational Software Architect
中实现三个基本的设计模式。本文的意图不是使您成为设计模式的专家,而是向您介绍
Rational Software Architect 所具有的模式功能。
Rational Software
Architect 中的设计模式
Rational Software Architect(IBM Software Development Platform 的一部分)允许架构师设计并维护应用程序体系结构。
该工具建立在 Eclipse 之上,因此开发人员和架构师可以利用 Rational Software Architect 中 Eclipse
平台的可用特性。另外,该工具提供丰富的建模和体系结构设计及发现功能,超过典型的集成开发环境(IDE)所具有的特征。这是设计模式流行的原因。
为了展示在 Rational Software Architect
中使用设计模式是多么简单的一件事,我将描述一个名为Singleton
模式的简单模式。
注意:本文中我所讨论的模式是为进行普通任务而随机选择的。
Singleton 模式
如其名称所暗示的,当您想要特别类的仅仅一个实例时,才使用
Singleton
模式。例如,如果您想要为一些数据库操作生成单键,那么您可以使用此创建类模式
——
在这种情况下,如果您想要一个用于返回这些键的类实例。在其他实例中,此模式也是有用的,包括登录和打印,例如,当您想要一个能够每次访问并控制一个特别打印机的类实例。
要想在 Rational Software Architect 中创建Singleton
模式的实例,就执行以下步骤。(在此实例中,我并没有针对其他与此模式相关的问题,如保持同步以确保线程安全。)
- 创建一个新的统一建模语言(Create a new Unified Modeling Language,UML)类图,然后打开上图
1 中显示的模式浏览器。
- 将Singleton 模式实例从模式浏览器中拖拽到 UML 类图视图中。
- 在模式参数窗口中,定义一个参数,称为
MySingleton (参见图 2)。执行此操作将会在模型浏览器中生成一个Singleton
模式的实例。
- 将实例拖拽到图表上。
- 为Singleton 模式创建私有属性,称为
_instance 。
- 为Singleton 模式创建两个方法:构造函数是私有的,且有一个公有的方法,称为
getInstance() 。
- 利用 UML 到 Java 的转换,为Singleton 模式生成代码(参见清单 1)。
图 2. 一个Singleton 模式的实例
![一个Singleton 模式的实例](images/figure122.jpg)
清单 1. 为Singleton 模式生成的代码
/*
* Created on Nov 20, 2004
*
* TODO To change the template for this generated file, go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author Kunal Mittal
*
* TODO To change the template for this generated type comment, go to
* Window - Preferences - Java - Code Style - Code Templates
* @uml.annotations
* derived_abstraction="platform:/resource/DesignPatternsProject/BlankModel.emx
* #_O5_0wDtjEdmuPoGm0fksdQ%2cuml2.Class%2cBlank+Model%3a%3aMySingleton"
* @generated "UML to Java (com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform)"
*/
public class MySingleton {
/**
* Comment for _instance
* @generated "UML to Java (com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform)"
*/
private Object _instance;
/**
*
* @generated "UML to Java (com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform)"
*/
private MySingleton() {
// TODO Auto-generated constructor stub
}
/**
*
*@generated "UML to Java (com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform)"
*/
public void getInstance() {
// TODO Auto-generated method stub
}
}
|
注意:我将在本文的后部讨论该模式的实例化。要了解更多关于创建
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
方法模式由以下类组成:
- Creator:如同创造者的类
- ConcreteCreator:一个或多个具体的创造者
- Product:抽象的产品类
- ConcreteProduct:一个或多个具体产品
- FactoryMapping:将创建者映射到产品上
要创建Factory 方法模式的实例,执行同Singleton
模式相同的步骤。图 3
显示了我创建的实例。在该实例中,模式由以下类组成:
- Creator: Game
- ConcreteCreator: BasicGame、AdvancedGame
- Product: Map
- ConcreteProduct: Room、Door、Wall、Window
- Factory Mapping:创建从 Basic Game 到 Room、Door
和 Wall 的参数关系。创建从 Advanced Game
到所有具体产品的参数关系。
图 3. 游戏 Factory 方法模式
![游戏 Factory 方法模式](images/figure123.jpg)
注意:在您生成代码并检查之前,要知道您也需要为
Factory 方法模式添加适当的方法。
在此实例中,直到玩家选择为止,Game
类才知道什么时候实例化具体的游戏类。在那时,Game
类需要适当地创建 BasicGame 或 AdvancedGame
类的实例。这是个典型的Factory 方法模式实例。
该模式的另一个实例是图书馆。图书馆有许多文档,如书、手稿和杂志。如果您建立一个图书馆管理应用程序,直到用户将文档拿到图书管理员桌子上,您才知道用户要查看的文档类型。作为练习,尝试使用
Rational Software Architect
建立一个该模式的图书馆模型。
您已经看过了两个创建的模式,现在让我们看看如何在
Rational Software Architect 中使用动作类的模式。
责任链模式
责任链模式用于促进请求的发送者或创始人(客户机)和接收请求的系统之间的松耦合。您会在以下情况使用责任链模式:
- 多于一个的类需要处理特别的请求
- 处理者的顺序需要动态指定
- 不能显式地指定请求的接收者
该模式允许您链接响应请求的对象。客户机将请求实例化,并将其作为处理者实例的参数进行传递。具体的处理者实现了一个获得请求对象的操作,并为链中的下一个处理者维持一个参考标准。具体的处理者是从抽象的处理者扩展而来。该模型的元素是:
- Handler:一个抽象类
- ConcreteHandler:具体的处理者实例
- HandleRequest:请求处理者
举一个批准过程的实例。在此情景下,客户机(在此情况下,公司的会计部分)提交用于批准的预算。预算需要经三个人批准:首席财政官(Chief
Financial Officer,CFO)、首席操作官(Chief Operating
Officer,COO),和首席执行官(Chief Executive Officer,CEO)。图
4
描述了该设计模式的一个简单实例。在此实例中,用到的类是:
- Handler:批准者
- ConcreteHandler: CEO、COO、CFO
- HandleRequest:批准预算
图 4. 批准过程的责任链模式实例
![批准过程的责任链模式实例](images/figure124.jpg)
作为另一个实例,考虑客户支持应用程序。当支持请求进入到
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 中。
|