我在数据库中有5个不同的表。我编写了一个抽象的“Converter.java”类,它从数据库中取出数据并将其转换为“tree.xml”文件。
Tree.xml
<?xml version="1.0" standalone="no"?>
<tree>
<declarations>
<attributeDec1 name="name" type="String"/>
</declarations>
<branch>
<attribute name="name" value="process 1"/>
<leaf>
<attribute name="name" value="process 2"/>
</leaf>
<leaf>
<attribute name="name" value="process 3"/>
</leaf>
</branch>
</tree>
正如您可以猜到的,上述tree.xml的结构对于所有5个表都将保持相同。唯一的区别在于属性“值”的值。
要获取该“value”属性的值,转换器首先必须在数据库中查询这些值。
因此,对于5个不同的表应该有5个不同的查询。因此,我没有编写5个不同的转换器,而是制作了一个具有类似
功能的单元“Converter.java”在上面的方法中,我已经实现了除addAttribute()方法之外的所有方法,因为它将根据表格实现。
之后,我编写了5个不同的转换器,每个转换器用于一个表,所有转换器都扩展为“Converter.java”
我在Converter.java类中创建了一个名为“query”的字段。由于这个字段是由所有5个转换器继承的,我已经在这5个转换器的构造函数中初始化了这个字段。
现在我的问题如下:
Q值。我不确定我是否正确使用了继承,或者上述方法是否应该有一些变化?
修改
Q2。我在Converter.java类中还有一个使用“查询”字段的方法。由于该字段未在Converter.java类中初始化,因此我是否在所有5个子转换器中复制该方法,或者可以将该方法放在父类中(即Converter.java)
答案 0 :(得分:3)
我认为战略模式在这里更合适。您可以使用常见行为创建非抽象Converter
类,并为其提供ValueSource
,它可以执行特定于表的值检索。然后创建QueryValueSource
(ValueSource
的子类)以根据指定的查询检索值。
要获得具体的策略,您可以将不同的查询传递给QueryValueSource
的构造函数,或者将其子类化以创建特定于表的源。
答案 1 :(得分:1)
希望我能正确理解你的问题。如果我这样做,那么听起来你正在直接初始化字段,如“mQuery = foo;”在每个构造函数?如果是这种情况,那么最好的形式可能只是在超类构造函数中初始化它,然后在每个子类构造函数中调用那个超类构造函数,如“super(foo);”。
答案 2 :(得分:0)
关于问题Q2:您可以做的是使Converter类抽象化,并为使用其中“query”属性的方法提供实现。使用Converter子类的构造函数来初始化查询属性。
关于Q1,我无法完全理解您提供的上下文的问题。可能是一些代码示例会有所帮助。但是有了这个有限的理解,我可以建议你是否考虑使用合成而不是继承会有所帮助?在我看来,Strategy模式在这里也可以使用。