实现动态数据导入工具的好的设计模式是什么?

5
我们计划开发一个动态数据导入工具。基本上,它可以将指定格式(Access、Excel、CSV)的信息传输到Web服务端。但是,我们不知道导出字段名称,因此应用程序需要能够查看WSDL定义并映射到另一端的有效条目。在导入部分,我们可以定义大多数字段,但通常会有一些自定义字段。我认为这没有问题。我只是想知道是否有一种设计模式适用于这种类型的应用程序或有助于其开发。
5个回答

3

我不确定你的应用程序中的复杂性在哪里,所以我将举一个例子,说明我如何使用模式导入不同格式的数据。我创建了一个工厂,它以文件格式作为参数并返回特定文件格式的解析器。然后我使用建造者模式。解析器提供了一个建造者,解析器在解析文件时调用该建造者来构造应用程序中所需的数据对象。

// In this example file format describes a house (complex data object)
AbstractReader reader = factory.createReader("name of file format");
AbstractBuilder builder = new HouseBuilder(list_of_houses);
reader.import(text_stream, builder);

// now the list_of_houses should contain an extra house
// as defined in the text_stream

2
我认为适配器模式是最合适的,因为你正在将数据从文件转换为对象,就像SqlDataDataAdapter将Sql表中的数据转换为DataTable一样。每种文件类型/格式都需要不同的适配器吗?例如SqlDataAdptor、MySqlDataAdapter,它们处理相同的命令但不同的数据源,以实现相同的DataTable输出。

适配器模式

希望这有帮助

Bones


1
据我所知,适配器只是在提供正确服务的类上适应了一个“错误”的接口。 - tunnuz
“Adaptor pattern” 的链接似乎已经失效。 - James John McGuire 'Jahmic'
固定链接..... - dbones

0

可能桥接模式比较适合,因为你需要处理不同的文件格式。 而外观模式可以简化使用。请小心处理我的回复,我还在学习设计模式 :)


0

你可能也需要抽象工厂模式和命令模式。

如果数据不符合输入格式,你可能需要进行一些转换。这就是命令模式发挥作用的地方。由于格式是动态的,你需要根据输入来生成相应的命令。这就是抽象工厂模式有效的地方。


0

我们的情况是需要从竞争对手的文件中导入参数化形状。他们屏幕和数据字段的布局相似,但有足够不同以进行转换过程。此外,我们有半打以上的竞争对手,如果仅通过代码进行维护,那将是一场噩梦。由于他们大多使用表来存储他们形状的参数,因此我们编写了一个通用的对象集合,以将X转换为Y。

在我的CAD/CAM应用程序中,文件导入是一个命令。但是,转换过程是通过规则集完成的,具体步骤如下。

  1. 将数据导入表格。根据格式,字段名称也会被拉入其中。
  2. 我们将表格传递给Ruleset。我将在一分钟内解释Ruleset的结构。
  3. Ruleset将数据转换为一组新对象(或表格),我们检索这些对象。
  4. 我们将结果传递给软件的其他部分。

Ruleset由一组规则组成。规则可以包含另一个规则。规则具有它测试的条件和映射表。

MAP TABLE(映射表)将输入字段与结果中的字段(或属性)进行映射。可以有一个或多个映射。映射不仅仅涉及将输入值插入到输出字段中。我们还有一种计算和字符串连接的语法。

这种语法也用于条件,并且可以包含多个文件,例如([INFIELD1] & "-" & [INFIELD2])="A-B" 或 [DIM1] + [DIM2] > 10。方括号内的任何内容都将被替换为输入字段。

规则可以包含其他规则。其工作方式是,为了应用子规则映射,它的条件以及其父级(或父级)的条件都必须为真。如果子规则具有与父级映射冲突的映射,则应用子规则映射。

如果同一级别上的两个规则具有相同的条件并具有冲突的映射,则具有较高索引(或在树视图中较低的列表)的规则将应用其映射。

嵌套规则等效于AND,而同一级别的规则等效于OR。

结果是应用于传入数据以将其转换为所需输出的映射表。

在 UI 中展示非常友好。换句话说,可以使用 Treeview 显示规则层次结构,使用侧面板显示规则的映射表和条件。同样重要的是,您可以创建向导来自动化常见的规则结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接