8.1 场 景 问 题
8.1.1 继续导出数据的应用框架
在讨论工厂方法模式的时候,提到了一个导出数据的应用框架。
对于导出数据的应用框架,通常在导出数据上,会有一些约定的方式,比如导出成文本格式、数据库备份形式、Excel格式、Xml格式等。
在工厂方法模式章节里面,讨论并使用工厂方法模式来解决了如何选择具体导出方式的问题,并没有涉及到每种方式具体如何实现。
换句话说,在讨论工厂方法模式的时候,并没有讨论如何实现导出成文本、Xml等具体的格式,本章就来讨论这个问题。
对于导出数据的应用框架,通常对于具体的导出内容和格式是有要求的,假如现在有如下的要求,简单描述一下:
■ 导出的文件,不管什么格式,都分成3个部分,分别是文件头、文件体和文件尾。
■ 在文件头部分,需要描述如下信息:分公司或门市点编号、导出数据的日期,对于文本格式,中间用逗号分隔。
■ 在文件体部分,需要描述如下信息:表名称,然后分条描述数据。对于文本格式,表名称单独占一行,数据描述一行算一条数据,字段间用逗号分隔。
■ 在文件尾部分,需要描述如下信息:输出人。
现在就要来实现上述功能。为了演示简单点,在工厂方法模式里面已经实现的功能,就再不重复了,这里只关心如何实现导出文件,而且只实现导出成文本格式和Xml格式就可以了,其他就不用考虑了。
8.1.2 不用模式的解决方案
不就是要实现导出数据到文本文件和XML文件吗?其实不管什么格式,需要导出的数据是一样的,只是具体导出到文件中的内容则会随着格式的不同而不同。
(1)下面将描述文件各个部分的数据对象定义出来。
先来看看描述输出到文件头的内容的对象。示例代码如下:
接下来看看描述输出数据的对象。示例代码如下:
再来看看描述输出到文件尾的内容的对象。示例代码如下:
(2)下面来具体地看看导出的实现。
先看看导出数据到文本文件的对象,主要就是要实现拼接输出的内容。示例代码如下:
(3)接下来看看导出数据到XML文件的对象,比较麻烦,要按照XML的格式进行拼接。示例代码如下:
(4)看看客户端,如何来使用这些对象。示例代码如下:
运行结果如下:
8.1.3 有何问题
仔细观察上面的实现,会发现,不管是输出成文本文件,还是输出到XML文件,在实现的时候,步骤基本上都是一样的,大致分成了以下四步。
(1)先拼接文件头的内容。
(2)然后拼接文件体的内容。
(3)再拼接文件尾的内容。
(4)最后把拼接好的内容输出去成为文件。
也就是说,对于不同的输出格式,处理步骤是一样的,但是每步的具体实现是不一样的。按照现在的实现方式,就存在如下的问题。
(1)构建每种输出格式的文件内容的时候,都会重复这几个处理步骤,应该提炼出来,形成公共的处理过程。
(2)今后可能会有很多不同输出格式的要求,这就需要在处理过程不变的情况下,能方便地切换不同的输出格式的处理。
换句话来说,也就是构建每种格式的数据文件的处理过程,应该和具体的步骤实现分开,这样就能够复用处理过程,而且能很容易地切换不同地输出格式。