用GOF模式设计GUI
2008-01-05 08:35:49 来源:WEB开发网核心提示:《设计模式》一书中为面向对象的软件设计引入了23个设计模式,这些模式被广泛应用,用GOF模式设计GUI,但只限于软件设计的目标领域,我们描述了如何在图形用户界面的概念性设计中使用6个设计模式, 已知应用 Windows NT使用策略对象来为打印机驱动程序设置参数,同样还有屏保,通过使用这些模式,设计者产生的界面能够更一
《设计模式》一书中为面向对象的软件设计引入了23个设计模式。这些模式被广泛应用,但只限于软件设计的目标领域。我们描述了如何在图形用户界面的概念性设计中使用6个设计模式。通过使用这些模式,设计者产生的界面能够更一致,更好地利用屏幕空间,更轻易使用。
本文展示了用于图形用户界面设计的6个模式(PRototype,Singleton,Adaptor,Composite,Proxy,Strategy),每个模式都起源于GOF中的同名模式。这些模式从Star和Smalltalk的早期工作开始就被广泛使用。我们用最近的GUI的一些例子来演示这些模式。为了把这些模式应用到GUI设计,我们已经把GOF模式从面向对象的软件设计领域转换到GUI领域。虽然GOF模式和我们的GUI模式都用了对象,接口,消息等术语,但我们已经把这些术语翻译到GUI领域。我们的对象指单个可控的GUI组件,比如一个图标,一个对话框,或一个窗口。单个对象可以不止一种表现形式。例如一个文档在关闭时可以表现为一个图标,而打开时可以是一个窗口。对象拥有一些属性,比如可编辑文本框,单选按钮,多选按钮;对象的行为可以由按钮,菜单,击键引发或直接控制这个对象而引发。一组具有相似属性和行为的对象形成一类,比如,所有的窗口对象可以归为窗口类。通过继续关系来捕捉对象之间的细微差别。类可以分组,例如,所有的目录窗口可以归为一类,所有的应用窗口可以归为另一类,而他们都是从窗口类继续而来。
这种转变表明了GOF领域和GUI领域的重要区别。GOF模式可以指对象的实现,而GUI模式只是必要地涉及GUI对象的接口。对那些主要和接口有关的的模式来说(比如代理或原型),区别很小。对那些主要和封装有关的模式来说(比如策略),相对应的GUI模式引出了模式的第二层面,比如参数化和定位对象。
这些模式并不涉及可用性,虽然我们在为可用性而扩展设计的界面中可以找到这些模式。我们相信这些模式和用户界面设计的其他技术(比如走查法(walkthrough),原型法,metrics,可视化方法(visualisation))是不相关的,就像软件开发中的模式是和其他软件开发技术是不相关的。相应的,GOF模式处于编程语言和和方法学之间,而这些模式也处在用户界面指南(用户界面语言规格)和用户界面方法学之间。
形式和内容
本文的大部分内容展示了我们识别出的6个GUI模式。这些模式以和GOF书中相对应的秩序和方式展示和组织。我们先从创建型模式--原型和单体模式开始,然后展示结构型模式--适配器模式,组合模式,代理模式,然后以行为型模式--策略模式结尾。本文包含了一个模式列表,而不是一个模式系统或一种模式语言。
因为文章长度上的原因,我们用一种简化的方式来展示这些模式。每一种模式都有一个名字,从GOF模式相应的段落中导出的目的声明。一个简短的问题说明描述了模式的动机和应用,然后模式所要解决的约束显式地列出条目。解决方案的结构、参与者、合作者和实现则组合在一个段落中。一幅图片演示了应用中的模式的一个例子,取代了GOF模式中代码例子。最后,列出了模式的积极和消极后果以及对已知应用例子的评论。这种形式把GOF形式中的主要叙述章节压缩成两个短小的段落(问题和解决方案),每个都带有相关列表(约束、后果等等)。
大多数的约束都来自于模式的内容,和GOF模式中的约束是同构的。这种同构是重要的,因为它确保跨领域的解决方案在形式上相似。这些模式同时也参考了GUI设计领域特有的约束。
? 界面应当保持一致是GUI设计领域一个明显的约束。在OO设计中,一致性用于解决其他问题,比如可重用性。
? 屏幕资源是重要的,通常是稀缺的资源
? GUI中的对象标志意味着一个对象通常只能在屏幕的某个地方出现一次。
相关模式
假如第一个软件模式语言确实是关于界面设计的,那么这个领域只有如此之少的模式和模式语言是令人吃惊的。工具和语言隐喻已在模式语言中有所描述,虽然语言本身涉及的实现和设计一样多。一些模式语言已经成文,并用于设计基于文字的WEB站点和表单式窗口。
ENVOI
我们相信一些GOF模式抓住了面向对象软件设计深层次的共同特性。本文是一个实验,想确定这些模式在相关但又显著不同的GUI设计领域是否可行(和有多好)。
GUI 原型(Prototype)创建型对象
目标 通过原型的实体来创建指定种类的对象,通过拷贝原型来创建新对象。
问题 GUI支持许多种不同的对象,这些对象的功能不同。用户需要创建能够存放他们的数据的合适对象。例如,桌面支持几种不同的文档类型,比如字处理文档,电子表格,数据库等。用户如何创建这些新对象?
约束 GUI原型模式解决了下列外部约束:
? 用户需要创建不同种类的文档
? 你不可能预见到系统中的所有类别
? 对象应当用一致的方法产生
解决方案 为每一个类创建一个原型对象。让用户通过拷贝恰当原型的方法来创建新对象。每一个类都应当理解"拷贝"消息,而且都是从所有用户对象的(父)类继续下来的。
案例 在SELF系统用户界面中,所有的对象都是通过复制现有的原型来创建的,并没有"CREATE"这样的操作。MACINTOSH 系统7答应文档被标志为"信笺板"。当用户打开信笺板时,信笺板被拷贝,然后拷贝被打开。
结果 GUI 原型模式有下列优点和缺点
+ 对所有的可拷贝类来说,用户可以用同一种方法来创建对象
+ 可以通过增加新原型来增加新类
+ 通过拷贝已经初始化过的对象,用户可以创建他们自己的类
- 用户也许需要清空新拷贝来的对象中的数据
- 用户也许忘记拷贝对象而偶然直接编辑原型
已知应用 原型首先在Sketchpad中使用。模式被显著地应用在Self UI系统,MoDE Composer,Macintosh等系统中。我们曾经给许多用户建议象本能一样地使用原型。
GUI 单体(Singleton)创建型模式
目标 确保一个类只有一个实体,同时提供能够作为全局变量使用
问题 一些类应该恰好只有一个实体。例如,代表真实硬件资源的对象,如硬盘,打印机,网络,非凡的系统对象如垃圾桶,在任何一个GUI中都应该只有一个。你该如何治理这些独一无二的对象呢?
约束 GUI Singleton 模式解决了以下约束:
? 这些对象应该只有一个实体。
? 单个实体应该能够轻易找得到。
? 用户界面应当一致。
? 屏幕资源是有限的。
解决方案 创建一个Singleton 对象,设计类使得用户不能拷贝或删除对象。GUI启动时就创建它,把它放到屏幕上(通常是桌面),这样它总是轻易找到。
案例 WINDOWS95里面的垃圾桶是一个Singleton。它没有大多数对象提供的删除和重命名命令。
结果 GUI Singleton 模式有如下优缺点:
+只有一个单体实体能被创建
+单体很轻易在桌面上找到
+单体具有象其他对象一样的行为
GUI 适配器(Adaptor)结构型对象
目标 把一个类的接口转成使用者期望的接口。,适配器模式让接口不兼容的类可以协同工作。
问题 每个接口有他们自己的世界,都有自己的文化,语言,样式。 使用者经常需要保有好几个世界。例如,当使用从GUI桌面继续下来的框架应用,或从另外一个桌面使用这个桌面。用户如何使用不兼容接口呢?
约束 GUI Adaptor 模式解决了以下约束:
? 用户需要使用有不兼容接口的对象
? 你不想改变这个接口
? 用户界面应当保持一致
解决方案 创建一个适配器对象,这个对象包容了另一个对象的接口。适配器是有主接口的正常对象,包容了被包含的接口。用户可以通过适配器与被包容的接口交互。适配器通常还提供了带外(out-of-band)操作来控制两个接口之间的连接。
用GOF模式设计GUI(2)
作者:James Noble 著,cntang 译 本文选自:UMLChina 2002年12月25日
案例 Window NT 接口可以适配以便在 X Windows 系统下运行(Tektronix菜单条控制适配器)。Windows NT 可以 通过终端模拟器来容纳文本式应用程序。
结果 GUI 适配器模式有如下优缺点:
+可以通过主接口来使用被包容的接口
+两个接口都无需改变
+通用适配器可以适配一系列接口,比如所有的文本应用程序。
-假如适配器中未遵循主接口的习惯用法,会导致用户接口不一致
已知应用 大多数GUI通过终端模拟器来支持文本式应用程序。Windows 和Macintosh界面可以适配运行在X系统中,或者相反。网页浏览器把www用户界面适配到范围很广的主界面。
参看 一个老式的包装器(Wrapper)是这种模式的更通用的形式。
GUI 组合(Composite)结构型对象
目的 把对象组合成树状机构来代表部分-整体层级。组合模式可以让用户统一对待单个对象和对象的组合。
问题 许多GUI对象是由其他GUI对象递归组成的。比如,磁盘包含了目录,目录又包含其他目录和文件。用户应该如何操纵这些组合对象?
约束 GUI组合模式解决了如下约束:
? 用户需要控制整个组合对象
? 用户需要控制组合对象中的单个部分。
? 用户界面应当一致
解决方案 创建能够递归包含其他对象的组合式对象,包括组合对象和原始对象。为所有由原始对象和组合对象共享的操作建立一个共同类。具体对象应继续于这个类,并扩展以提供它们自己的操作。
案例 在Self UI系统中,任何一个图形对象都可被组合(嵌入)来创建组合式结构。Window NT 把目录结构表示成组合对象。
结果 GUI组合模式有如下优缺点:
+用户既可以操纵整个对象,也可以操纵其中的一部分。
+通用操作的接口是一致的。
-很难把非凡的一部分从整体中独立出来。
已知应用 Macintosh 和Windows95界面使用组合对象来代表目录结构。MacDraw和许多其他图像编辑器通过显式分组和非分组图形对象来创建组合对象。
GUI 代理(Proxy)结构式对象
目的 提供一个代理或放置地以方便另一个对象来存取。
问题 某些对象从来不在用户想要的地方。比如,用户想要存储目录结构下很深的一个文件,想让它很轻易存取。或者用户希望下载一个网页,放弃任何包含的图像而保持文档结构不变。一个对象如何才能同时出现在两个地方呢?
约束 GUI代理模式解决了如下约束:
? 用户想要一个对象同时出现在两个地方。
? GUI对象识别要求一个对象只能出现在一个地方
? 你不想改变或移动原始对象。
? 原始对象的检索很困难或很昂贵。
? 用户界面应当一致。
解决方案 创建一个代理对象来代表远程或昂贵的对象。把代理对象放在你想要放原始对象的地方,但不能让代理象原始对象一样操作,而是可视地把代理同原始对象区别开来。
案例 Wwidows95 快捷方式行为方式象代理一样,所以一个对象可以出现在桌面的许多个地方。Netscape用图标作为还未下载图片的代理。
结果 GUI代理模式有如下的优缺点:
+原始对象可以同时出现在两个地方
+原始对象不需要改变
+通过代理存取原始对象是透明的
+用户可以区分原始对象和代理
-假如原始对象不可用,代理也会不可用
已知应用 Macintosh 别名和Window95快捷方式的行为方式象放在另外一个地方的远程代理。Netscape使用图标作为还未下载 的图像的虚拟代理。许多网页使用缩略图来作为大图的代理。
参看 《面向模式的软件体系结构》一书也描述了代理模式。
GUI 策略(Strategy)行为式对象
目的 定义一个算法家族,并使它们可以互换。
问题 一个对象使用几种算法,每个都有自己的接口和客户参数设置。用户需要为它们选择的算法设置参数。例如,一个屏保程序提供了几种不同的显示算法(文本,二维图像,三维图像)每个都有自己的参数(要显示的文本,颜色,纹理,三维对象)。 用户如何处理这些不同的算法呢?
约束 GUI 策略模式解决了如下约束:
? 一个对象需要不同参数的不同算法
? 用户应该选择算法和其参数
? 用户界面应当一致。
? 屏幕资源有限
解决方案 创建一个独立的策略对象来代表每一个算法,把每种算法的参数作为策略对象的属性。让策略对象从属于使用算法的对象。用户可以通过主对象选择一种算法,然后通过和策略对象交互来设定算法的参数。
案例 Windows NT 使用策略对象来设置屏保应用程序的参数。
结果 GUI策略模式有如下的优缺点:
+ 策略对象显式代表了不同的算法
+用户可以选择一种算法和设置算法的参数
+在提供一个策略对象的同时保留资源
-改变策略对象也许使界面一致性变差
-接口包含了逐渐增长的对象。
已知应用 Windows NT使用策略对象来为打印机驱动程序设置参数,同样还有屏保。PaintShop Pro 和 XV使用策略对象来设置文件转换算法的参数。
赞助商链接