这一章讲述了文档编辑器的设计架构,其中涉及了以下八种设计模式。
Recursive Composition(递归组合)
层次结构信息的表述通常是通过一种被称为递归组合的技术来实现的。递归组合可以由较简单的元素逐渐建立复杂的元素,是我们通过简单图形元素构造文档的方法之一。第一步,我们将字符和图形从左到右排列形成文档的一行,然后由多行形成一列,再由多列形成一页,等等
上图抽象如下:
通过用对象表示文档的每一个字符和图形元素,我们可以提高文档编辑器最佳设计的灵活性。对于上面的图元,抽象出图元的相同的接口和属性,从而得出这些图元的基类,类图如下所示:
由此一来,所有的图元都有相同的基类和部分相同的接口名,子类通过重定义接口,实现不同图元的多态性,这有利于一致的对待图元对象。这一点类似于象棋中的棋子管理和Qt中的窗口控件管理。
Strategy
在对象中封装算法是strategy模式的目的,模式的主要参与者是strategy对象(这些对象中封装了不同的算法)和他们的操作环境。
文本的格式化:将一个图元集合分解为若干行,将行分成列,还需要考虑用户的其他要求:用户可能指定边界的宽度,缩进大小和表格形式等等。格式化算法需要将这些因素考虑在内。
模式要求:1、算法易于改变
2、算法易于扩展
3、不干涉图元逻辑
4、格式化质量与速度的权衡
其中每个compositor的子类都对应一种不同的格式化算法。图元格式化可以选择不同的格式化算法。
未经格式化的composition对象包含组成文档基本内容的可见图元。但是不包含行和列这些决定文档结构的图元。经过格式化后,才会生成可见的具有一定文档结构的文档。
Decorator模式
这个模式在书中的例子是加边框。因为并非所有的子类都需要加边框,通过如下继承关系,在抽象子类中调用父类的函数,其他子类通过继承抽象子类,以重写或不重写draw接口,来选择是否使用父类的draw函数,来达到是否修饰子类的目的。
(1)调用父类
(2)重写子类
Abstract Factory
获得跨越硬件和软件平台的可移植性是系统式设计的主要问题之一。将文档编辑器定位于一个新的平台不应对代码做重大的修改。抽象工厂架构如下所示:
通过索引,宏定义或者配置文件等方式,锁定具体的操作系统类型,调用特定的Factory。书中截图如下所示:
Bridge
即使使用abstract factory模式创建了不同操作系统的对象,各个操作系统的接口很可能并不兼容。比如说画一个矩形:
(1)可以定义矩形的起点和长宽来绘制矩形
(2)可以定义矩形的四个顶点来绘制矩形
鉴于此,在做操作系统兼容时,尚需为不同的操作系统接口做适配。此外,不同的操作系统可能会有不同的接口,这里可以选择不同操作系统接口的交集或者并集,更一般的情况是,封装工程中需要用的接口与未来可能会用到的接口。桥接模式截图如下:
command
对不同的请求进行参数化(或者说对不同的操作、命令等参数化)。当用户(或者软件)发出请求时,携带对应的请求的参数信息,根据该参数执行相应的操作。举例:比如说窗口的按钮响应消息。会根据不同的按钮ID值,获取是哪个按钮被点击了。然后便可以执行该按钮点击的处理函数
Iterator
将数据结构遍历的算法和遍历过程的数据处理分开。
visitor
使用术语访问者,来泛指在遍历过程中“访问”被遍历对象并做适当操作的一类对象。