我不确定你的应用程序中的复杂性在哪里,所以我将举一个例子,说明我如何使用模式导入不同格式的数据。我创建了一个工厂,它以文件格式作为参数并返回特定文件格式的解析器。然后我使用建造者模式。解析器提供了一个建造者,解析器在解析文件时调用该建造者来构造应用程序中所需的数据对象。
// 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
希望这有帮助
Bones
可能桥接模式比较适合,因为你需要处理不同的文件格式。 而外观模式可以简化使用。请小心处理我的回复,我还在学习设计模式 :)
你可能也需要抽象工厂模式和命令模式。
如果数据不符合输入格式,你可能需要进行一些转换。这就是命令模式发挥作用的地方。由于格式是动态的,你需要根据输入来生成相应的命令。这就是抽象工厂模式有效的地方。
我们的情况是需要从竞争对手的文件中导入参数化形状。他们屏幕和数据字段的布局相似,但有足够不同以进行转换过程。此外,我们有半打以上的竞争对手,如果仅通过代码进行维护,那将是一场噩梦。由于他们大多使用表来存储他们形状的参数,因此我们编写了一个通用的对象集合,以将X转换为Y。
在我的CAD/CAM应用程序中,文件导入是一个命令。但是,转换过程是通过规则集完成的,具体步骤如下。
Ruleset由一组规则组成。规则可以包含另一个规则。规则具有它测试的条件和映射表。
MAP TABLE(映射表)将输入字段与结果中的字段(或属性)进行映射。可以有一个或多个映射。映射不仅仅涉及将输入值插入到输出字段中。我们还有一种计算和字符串连接的语法。
这种语法也用于条件,并且可以包含多个文件,例如([INFIELD1] & "-" & [INFIELD2])="A-B" 或 [DIM1] + [DIM2] > 10。方括号内的任何内容都将被替换为输入字段。
规则可以包含其他规则。其工作方式是,为了应用子规则映射,它的条件以及其父级(或父级)的条件都必须为真。如果子规则具有与父级映射冲突的映射,则应用子规则映射。
如果同一级别上的两个规则具有相同的条件并具有冲突的映射,则具有较高索引(或在树视图中较低的列表)的规则将应用其映射。
嵌套规则等效于AND,而同一级别的规则等效于OR。
结果是应用于传入数据以将其转换为所需输出的映射表。
在 UI 中展示非常友好。换句话说,可以使用 Treeview 显示规则层次结构,使用侧面板显示规则的映射表和条件。同样重要的是,您可以创建向导来自动化常见的规则结构。