《设计模式》一书中为面向对象的软件设计引入了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等系统中。我们曾经给许多用户建议象本能一样地使用原型