8.1 场 景 问 题

8.1.1 继续导出数据的应用框架

在讨论工厂方法模式的时候,提到了一个导出数据的应用框架。

对于导出数据的应用框架,通常在导出数据上,会有一些约定的方式,比如导出成文本格式、数据库备份形式、Excel格式、Xml格式等。

在工厂方法模式章节里面,讨论并使用工厂方法模式来解决了如何选择具体导出方式的问题,并没有涉及到每种方式具体如何实现。

换句话说,在讨论工厂方法模式的时候,并没有讨论如何实现导出成文本、Xml等具体的格式,本章就来讨论这个问题。

对于导出数据的应用框架,通常对于具体的导出内容和格式是有要求的,假如现在有如下的要求,简单描述一下:

■ 导出的文件,不管什么格式,都分成3个部分,分别是文件头、文件体和文件尾。

■ 在文件头部分,需要描述如下信息:分公司或门市点编号、导出数据的日期,对于文本格式,中间用逗号分隔。

■ 在文件体部分,需要描述如下信息:表名称,然后分条描述数据。对于文本格式,表名称单独占一行,数据描述一行算一条数据,字段间用逗号分隔。

■ 在文件尾部分,需要描述如下信息:输出人。

现在就要来实现上述功能。为了演示简单点,在工厂方法模式里面已经实现的功能,就再不重复了,这里只关心如何实现导出文件,而且只实现导出成文本格式和Xml格式就可以了,其他就不用考虑了。

8.1.2 不用模式的解决方案

不就是要实现导出数据到文本文件和XML文件吗?其实不管什么格式,需要导出的数据是一样的,只是具体导出到文件中的内容则会随着格式的不同而不同。

(1)下面将描述文件各个部分的数据对象定义出来。

先来看看描述输出到文件头的内容的对象。示例代码如下:

18f7ca4bc789494c94cf647f52abec42

274fc037fb964631bf39749bddfde6ac

接下来看看描述输出数据的对象。示例代码如下:

666d4082c642451d888344b5bcf6a24f

aeac74a696c74255bced96190cb61ba9

再来看看描述输出到文件尾的内容的对象。示例代码如下:

370e1c31af44456682f535de1aa74d9e

(2)下面来具体地看看导出的实现。

先看看导出数据到文本文件的对象,主要就是要实现拼接输出的内容。示例代码如下:

1e1833f41f6b4cb584faa46459e11817

b535be62aa2f4a21bbcaee570fbb938e

(3)接下来看看导出数据到XML文件的对象,比较麻烦,要按照XML的格式进行拼接。示例代码如下:

2600afc890eb405588b9f90c92b609ed

07a54bd761354ca38393b847904653f1

c5c984d5580240678c9e60ea28c0c118

a1d09ec77d3a4a3d948a542f61801c28

(4)看看客户端,如何来使用这些对象。示例代码如下:

74bafb632ac84f4bbba4cca327e74cba

bccdf1c648e940d196a62acbbd165be5

dcd9d3360815498b8d1e0e20c8dfed1a

运行结果如下:

bf2571ea6370443ca33f6e003cf93611

c7c41845abdb44c98bb422623276d839

8.1.3 有何问题

仔细观察上面的实现,会发现,不管是输出成文本文件,还是输出到XML文件,在实现的时候,步骤基本上都是一样的,大致分成了以下四步。

(1)先拼接文件头的内容。

(2)然后拼接文件体的内容。

(3)再拼接文件尾的内容。

(4)最后把拼接好的内容输出去成为文件。

也就是说,对于不同的输出格式,处理步骤是一样的,但是每步的具体实现是不一样的。按照现在的实现方式,就存在如下的问题。

(1)构建每种输出格式的文件内容的时候,都会重复这几个处理步骤,应该提炼出来,形成公共的处理过程。

(2)今后可能会有很多不同输出格式的要求,这就需要在处理过程不变的情况下,能方便地切换不同的输出格式的处理。

换句话来说,也就是构建每种格式的数据文件的处理过程,应该和具体的步骤实现分开,这样就能够复用处理过程,而且能很容易地切换不同地输出格式。

可是该如何实现呢?