【问题标题】:Design pattern to truncate a large object graph截断大对象图的设计模式
【发布时间】:2012-10-16 17:09:21
【问题描述】:

使用 Java,我有一个非常大的对象图,其中一个对象与许多其他对象相关联,每个对象都与许多其他对象相关联。大多数时候,我只需要一个子图来传递给方法或通过网络发送。

是否有推荐的设计模式,以便我可以在图中的许多点截断这个大对象图。一种方法是在所有截断点提供 NULL 作为参考。如果有任何其他想法,我将不胜感激。

谢谢

【问题讨论】:

  • 您不需要设计模式(就 GoF 而言),但需要适当的图表示(数据结构),它提供截断和其他(子)图操作的算法。您当前的数据结构是什么?
  • 对象结构由许多领域对象组成。每个对象都与一个或多个其他域对象相关,并且这种关系一直延续下去。一个示例域可以从一个组织开始,它与它的人员、它拥有的各种属性、它购买、销售的产品等的链接 - 一个大型的相互关联的类图。
  • 如何指定子图?您的子图是否包含一组节点对象?
  • 您的用例听起来像是对数据库的使用,您可以在其中使用 SQL 子句 WHERE 过滤子集。也许graph database 比较合适。

标签: java object graph


【解决方案1】:

如果我理解正确,您可以使用Lazy Factory
此策略通常用于将对象与您现在不需要的关联进行映射,并且可能根本不需要。 (在 Hibernate ORM 中广泛使用)。
当您想通过网络发送大型对象时,您可以使用代理模式。

【讨论】:

    【解决方案2】:

    一种选择是用 Node 对象构建图形(就像您现在所做的那样),然后截断图形,用 Graph 对象封装它,该对象将图形存储为成员,提供自己的运行接口对图进行操作,并在内部使用将被视为从图中删除的节点表。

    这种方法的好处是您不会改变原始图形对象本身,也不必复制它。

    【讨论】:

      【解决方案3】:

      Proxy Pattern 是解决这类问题的一个很好的设计模式。

      【讨论】:

      • 我可以看到懒惰的工厂如何帮助解决这个问题。我想了解代理模式如何。您能否举例说明您的答案?
      • 实体代理可以从一个公共接口创建,该接口也由真实对象实现。每个实体及其代理的主键被传递给它的构造方法。真实实体将有一个加载方法来根据其主键从数据库中获取数据。当请求真实对象时,代理对象将使用组合调用真实对象加载方法,在延迟加载模式中。
      猜你喜欢
      • 1970-01-01
      • 2017-08-11
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      相关资源
      最近更新 更多