我有以下数据结构,包括一个表和一个属性列表(简化):
class Table {
List<Attribute> m_attributes;
}
abstract class Attribute {}
class LongAttribute extends Attribute {}
class StringAttribute extends Attribute {}
class DateAttribute extends Attribute {}
...
现在我想对此数据结构执行不同的操作:
我的第一次尝试是将所有这些功能放在Attribute
中,但Attribute
的任务负担过重。
感觉visitor pattern可以很好地完成这项工作,但另一方面,对于这种简单的结构来说,它看起来有些过分。
解决这个问题最优雅的方法是什么?
答案 0 :(得分:1)
Command pattern浮现在脑海中,或者是它的一小部分。
你有很多类,每个类都专门用于处理你的数据类。您可以将这些类保存在散列映射或其他结构中,外部选择可以选择一个执行。为了做到这一点,你可以用你的数据作为参数来调用所选Command的execute()方法。
编辑:详细说明。
在底层,您需要对数据行的每个属性执行某些操作。 这确实听起来像访客模式:访客模拟双重 调度操作,只要您能够组合变量“受害者”对象 使用封装在方法中的变量“operation”。
您的所有属性都需要进行xml-ed,text-ed,insert-ed updat-ed和initializ-ed。 所以你最终得到一个5 x 3类的矩阵来完成这5个操作中的每一个 3个属性类型中的每一个。访客模式的其余机制 将遍历您的属性列表并应用正确的访问者 您以正确的方式为每个属性选择的操作。
写15个类加上接口确实听起来有点沉重。你可以这样做 并有一个非常通用和灵活的解决方案。另一方面,在时间 你花了很多时间考虑一个解决方案,你可能会把代码整合在一起 以它为目前已知的结构并用手指划过那个形状 你的课程不会经常改变太多。
我想到的命令模式是用于选择各种类似的 操作。如果要执行的操作以字符串形式出现,可能在a中 脚本或配置文件等,您可以从
获得映射"xml" -> XmlifierCommand
"text" -> TextPrinterCommand
"serial" -> SerializerCommand
...其中每个命令都会启动相应的访问者 工作。但是,由于操作更有可能在代码中确定,您可能 不需要这个。
答案 1 :(得分:1)
JAXB将允许您对XML进行编组和解组。默认情况下,属性将转换为与属性同名的元素,但可以通过@XmlElement和@XmlAttribute注释进行控制。
Hibernate(或JPA)是将数据对象移入和移出数据库的标准方法。
答案 2 :(得分:1)
我不知道为什么你这些天自己将东西存放在数据库中而不仅仅是使用hibernate,但这是我的电话:
LongAttribute
,DateAttribute
,StringAttribute
,...都有不同的内部结构(即属性类中没有特定于它们的字段),因此您无法创建一个通用方法来将它们全部序列化。现在,XML,SQL和纯文本在序列化时都具有不同的属性。你真的没办法避免编写 O(Attribute
#output格式的子类)*不同的序列化方法。
访问者对于序列化来说并不是一个糟糕的模式。没错,如果在非递归结构上使用它有点过分,但是随机程序员读取你的代码会立即掌握它正在做的事情。
现在进行反序列化(从XML到对象,从SQL到对象),你需要一个工厂。
还有一个提示,对于SQL更新,您可能希望获得一些旧版本的对象,新版本的对象,并仅根据它们之间的差异创建更新查询。
答案 3 :(得分:0)
最后,我使用了访客模式。回顾过去,这是一个不错的选择。