Aha!设计模式(11)-BUILDER(2)

2019-04-13 13:29发布

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