动机
《设计模式》中关于BUILDER动机的说明使用的是RTF文档格式转换的例子。这个例子本身很容易理解,这里就不再重复了。本文只讲作者本人的见解。
还是那一招
本连载提到过:大部分情况下,设计模式也好,面向对象也好其实就是一招,多态。这个结论对于BUILDER模式同样使用。具体到《设计模式》中的例子,希望变化的就是输出的类型或者说格式。基于这个想法,即使我们没有学习设计模式,也可以进行基本的思考。
对于一个格式转换处理来讲,至少应该包括下面三个步骤:读入数据,处理数据,输出数据。本文的内容是BUILDER设计模式,所以我们将焦点定在输出上。我们可以这样这样设计。
![](data/attach/1904/ago30bbjmi881hpi04r8sygd0cwj1mqk.jpg)
按照上面的设计,当我们希望追加一种新的输出格式时,只要增加新的具象类就可以了。
足够简单的类
上述设计在输出内容简单的时候没有什么问题,当输入内容比较复杂的时候,会有一些问题:
-
除了真正的输出以外,至少还会包含另外的处理,例如数据结构的遍历,有的时候也会包含解析的内容。
-
各个类中处理数据共同结构(页,段落等)的部分应该很类似,只是具体输
出的部分有所不同。
解决这些问题的方法就是进一步分离共通处理,让FileWriter只处理真正不同的部分,其他数据遍历等内容则交给其他的类。
![](data/attach/1904/xj3rfqvmdroy0drartthh99725w6jgah.jpg)
走到这一步,基本就和BUILDER模式没啥区别了。下图是BUILDER设计模式中动机部分的类图。
![](data/attach/1904/wgnig10584q611ovczi9beg8o9nduflz.jpg)
这两个类图主要有三个区别:
-
类名不同,作者使用的Writer而不是Converter,是希望更加明确地表示类的功能只包含最后输出的功能。
-
builder/writer的位置。这两个名词都是用来指定Converter/Writer数据成员的名称的。《设计模式》书中标在了RTFReader一侧,而作者的图中标在了Writer一侧。哪种情况正确,大家可以参照UML方面的书籍。
-
作者的例子另外增加了begin/end方法,这种方式下对应的具象类会比较容易实现。
无论谁是谁非,BUILDER的思想都是不变的。
作者观点
一个类只干一件事。
大道至简,这个原则应该可以很好地诠释这句话。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】