设计模式实例研究-设计一个文档编辑器.ppt
第二十二章实例研究:设计一个文档编辑器;菜单和滚动条,以及一些用来跳到特定页的页码图标。;2.1设计问题
我们将考察Lexi设计中的7个问题:
1)文档结构对文档内部表示的选择几乎影响Lexi设计的每个方面。所有的编辑、格式安排、显示和文本分析都涉及到这种表示。我们怎样组织这个信息会影响到应用的其他方面。
2)格式化Lexi是怎样将文本和图形安排到行和列上的?哪些对象负责执行不同的格式策略?这些策略又是怎样和内部表述相互作用的?
3)修饰用户界面Lexi的用户界面包括滚动条、边界和用来修饰WYSIWYG文档界面的阴影。这些;修饰有可能随着Lexi用户界面的演化而发生变化。因此,在不影响应用其他方面的情况下,能自由增加和去除这些修饰就十分重要了。
4)支持多种视感(look-and-feel)标准Lexi应不需作较大修改就能适应不同的视感标准,如Motif和PresentationManager(PM)等。
5)支持多种窗口系统不同的视感标准通常是在不同的窗口系统上实现的。Lexi的设计应尽可能的独立于窗口系统。
6)用户操作用户通过不同的用户界面控制Lexi,包括按钮和下拉菜单。这些界面对应的功能;分散在整个应用对象中。这里的难点在于提供一个统一的机制,既可以访问这些分散的功能,又可以对操作进行撤消(undo)。
7)拼写检查和连字符Lexi是怎样支持像检查拼写错误和决定连字符的连字点这样的分析操作的?当我们不得不添加一个新的分析操作时,我们怎样尽量少修改相关的类?
我们将在下面的各节里讨论这些设计问题。每个问题都有一组相关联的目标集合和我们怎样到达这些目标的限制条件集合。在给出特定解决方案之前,我们会详细解释设计问题的目标和限制条件。问题和其;解决方案会列举一个或多个设计模式。对每个问题的讨论将在对相关设计模式的简单介绍后结束。
2.2文档结构
从根本上来说,一个文档只是对字符、线、多边形和其他图形元素的一种安排。这些元素记录了文档的整个信息内容。然而,一个文档作者通常并不将这些元素看作图形项,而是看作文档的物理结构—行、列、图形、表和其他子??构。而这些子结构也有自己的子结构。
Lexi的用户界面应该让用户直接操纵这些子结构。例如,一个用户应该能够将一个图表当作一个单元,;而不是个别图形原语的一组集合。用户应该能够对表进行整体引用,而不是将表作为非结构化的一堆文本和图形。这有助于使界面简单和直观。为了使Lexi的实现具有类似的性质,我们选择能匹配文档物理结构的内部表示。
特别的,内部表示应支持如下几点:
?保持文档的物理结构。即将文本和图形安排到行、列、表等。
?可视化生成和显示文档。
?根据显示位置来映射文档内部表示的元素。这可以使Lexi根据用户在可视化表示中所点击的某个;东西来决定用户所引用的文档元素。
除了这些目标外,还有一些限制条件。首先,我们应该一致对待文本和图形。应用界面允许用户在图形中自由的嵌入文本,反之亦然。我们应该防止将图形看作文本的一种特殊情形,或将文本看作图形的特例。否那么,我们最后得到的是冗余的格式和操纵机制。机制集合应该使文本和图形都能满足。
其次,我们的实现不应该过分强调内部表示中单个元素和元素组之间的差异。Lexi应该能够一致地对待简单元素和组合元素,这样就允许任意复杂的文档。例如,第5行第2列的第10个元素既可以是一个字符,也可以是一个由许多子元素组成的复杂图表。一旦;我们知道这个元素能够画出自己并指定了它的区域,那么它怎样显示在页面上和它的显示位置确实定就并不困难了。
然而,为了检查拼写错误和确定连字符的连接点,需要对文本进行分析。这就与第二个限制条件产生了矛盾。我们通常并不关心一行上的元素是简单对象还是复杂对象,但是文本分析有时候依赖于被分析的对象。例如,检查多边形的拼写或以连字符连接它是没有意义的。文档内部表示设计应该考虑和权衡这个或其他潜在的彼此矛盾的限制条件。;2.2.1递归组合
层次结构信息的表述通常是通过一种被称为递归组合(RecursiveComposition)的技术来实现的。递归组合可以由较简单的元素逐渐建立复杂的元素,是我们通过简单图形元素构造文档的方法之一。第一步,我们将字符和图形从左到右排列形成文档的一行,然后由多行形成一列,再由多列形成一页,等等,见以下图。;;我们将每一个重要元素表示成一个对象,就可以描述这种物理结构。它不仅包括字符、图形等可见