作者小感:
设计模式这本书,对于我来说,初学者看起来比较懵懂,稍微有些枯燥。所以得耐着性子看。看完每一章节,就会有成就感,也确实能够打心眼赞成这种设计模式。
第二章,是从设计一个文档编辑器这个例子,告诉大家:设计模式在应用中的作用,以及如何根据需求来判断使用哪种模式。
这个例子好长哦,一定要耐心。看完这个例子,更是加强了我学习设计模式的决心。
大家一起努力哦。^o^
Lexi文档编辑器设计时面临的问题:
(1)文档结构 。即文档物理结构的表示问题。文档中包含各种类型的图元,如:文字,图形,行,列,还有组合的图元。如何组织这些图元。
(2)格式化。如何构造文档结构,如:将文本分行,分列,用户制定边界宽度等等。
(3)修饰用户界面。 在文档区域周围加边界,加滚动条等。
(4)支持多视感标准。支持多种不同风格的用户界面。比如:按钮可以是矩形,也可是圆形。
(5)支持多种窗口系统。移植性问题。例如:窗口环境不同的窗口系统,他的大小得根据实际硬件大小来限制。
(6)用户操作。 用户操作有很多种,并且同一种用户目的,可由多种命令操作实现。比如:既可以通过菜单项来实现撤销,也可以通过键盘快捷键来实现。
(7)拼写检查和连字符。如何遍历不同数据结构存储的元素。如何对不同类型的图元进行检查。
(在本章中,大多数是使用类和对象的组合关系来实现,并不提倡继承方式)
下面,具体介绍每个问题。
(1)文档结构
总体思想:每种图元都是一种对象,对图元对象进行递归组合(recursive composition)。用到的模式为:Composite模式。
Composite模式可以表示复杂的、层次式的结构,描述了面向对象的递归组合的本质。
递归组合,可以由简单的元素逐渐建立复杂的元素,是我们用简单图元构造复杂文档的方法之一。在文档结构中,应该一致对待文本和图形,因此我们将这些图元抽象出来抽象类Glyph,不同图元(字符、矩形、行、列)是Glyph的子类。
(2)格式化(即:Composite,组合)
总体思想:将格式化算法抽象出来,作为格式化类Compositor类。每一个Compositor类的子类可以实现一个各自的不同的格式化算法(如,不同的分行算法)。格式化类Compositor类和他的子类构成了一个格式化类层次,封装格式化算法。用到的模式为:Strategy模式。
Compositor格式化的图元是Composition图元的各个子图元。Composition 类中包含(聚合)一个Compositor类型的对象;Compositor类中包含(关联)一个Composition *类型的指针。一个Composition创建时候得到一个Compositor子类的对象,composition需要格式化的时候,让它的Compositor对象调用Compositor::compose()操作,该操作遍历composition的各个子图元,并进行格式化。
这里用到的Strategy模式,该模式封装了策略和操作环境。compositor是策略(格式化算法),composition(组合的图元)是策略的环境。Compositor和Composition的分离确保了文档物理结构和不同格式化算法之间的