建筑对象集合的模式与相互依赖

时间:2014-03-10 21:34:42

标签: design-patterns instantiation

在我参与的多个项目中,我遇到了同样的情况:从XML数据或数据库构建对象系列。

例如,我们可以考虑电子商务实体:

  • 模型实体:产品,类别,价格,定制,......(每个实体由ID标识)。
  • 实体之间的一些“复杂”关系:
    • 产品有类别,价格,自定义列表,推荐产品列表
    • 类别可以包含父类别
    • ...

现在我们要加载XML数据的对象表示。根据XML模式,我们正在构建的实体与另一个尚未创建的实体有关系。

面对这种情况,我总是最终采用这种策略:

  • 为每个实体类型设置一个字典,所以我可以知道他的ID
  • 到达一个对象
  • 对于每个关系,有一个List>表示“此对象缺少关系,您必须稍后使用具有此ID的对象解决它”

因此,在构建对象时:

  • 如果属性是引用另一个对象的ID,我会查看具有此ID的相应字典。如果找到,则设置属性。如果没有找到,我会存入
  • 我将此对象引用添加到Dictionary中(但对象是否完整),并继续使用以下对象

构建所有对象时,仍然缺少关系。所以我遍历我的列表并解决。

我总觉得这很难看:

  • 很多代码(我的团队真的无法理解),
  • 很多字典和列表,
  • 可能表现不佳

这种情况有没有共同/良好的模式?创作模式或IOC可以帮助我的任何方式(不能真正看到如何)?

2 个答案:

答案 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>