在我参与的多个项目中,我遇到了同样的情况:从XML数据或数据库构建对象系列。
例如,我们可以考虑电子商务实体:
现在我们要加载XML数据的对象表示。根据XML模式,我们正在构建的实体与另一个尚未创建的实体有关系。
面对这种情况,我总是最终采用这种策略:
因此,在构建对象时:
构建所有对象时,仍然缺少关系。所以我遍历我的列表并解决。
我总觉得这很难看:
这种情况有没有共同/良好的模式?创作模式或IOC可以帮助我的任何方式(不能真正看到如何)?
答案 0 :(得分:0)
问题分为两部分:
1)维护一个对象树(严格聚合或包含) 2)维护对象网络。
如果你使用像JAXB这样的技术从XML文件构建树,解决(1),你只需要做一些额外的传递来a)建立字典和b)解析引用来解决(2) )。
这种方法的优势在于JAXB是一种维护良好的技术,并且可以说是有据可查的。有了80%的问题,你可以为第二部分制作一些文档。
答案 1 :(得分:0)
您可以使用Builder。使用Builder,您有一个协议,用于构建您试图与其特定构造元素的细节分开的东西,因此您将拥有XML构建器和数据库构建器。
这个问题是Builder真的是为分阶段构建的东西而设计的。你的描述确实有一些阶段的概念,但它主要只是通常的叶/节点构造逻辑。
当然,这意味着Composite(Builder通常与Composite一起使用)。毫无疑问,这可以在这里发挥。
我建议的主要是避免完全抽象的梦想。多年来,似乎每个人都希望能够将任意复杂的图形交给能够在XML中序列化和反序列化的图形。这是一个愚蠢的梦想,正如Apache Axis项目可以证明的那样,可以让你活着。
如果你看一下这个问题在Cocoa中解决的方式(有史以来最好的AFAIC),就有一个名为NSCoding的协议(接口)。您要持久化的每个实体都实现了这一点。有两种方法:编码/解码。关键是你只是说'这就是我需要存储的东西,这就是我如何重建自己。'但这种方法的真正之处在于,您将实际格式完全分开,并且只能完成一次!所以假设你想用JSON编码一个对象图。你编写一个JSON编码器和解码器一次,然后在未来一年,有人可以进入项目并添加到对象图并使他们的新东西可序列化,甚至没有看到舔JSON代码(或写任何)。 / p>