使用设计模式在Java中增强现有数据结构以在运行时添加额外信息

3
我将以一个小例子开始:
想象一下一个带有几个实体的应用程序。
EntityA -1---n-> EntityB -1---n-> EntityC
假设我们有一个服务方法,返回一个EnityC实例列表。在UI中,我们想要显示EntityC,但还要为UI添加一些仅与UI相关的附加信息(例如css类)。解决这个问题的常见方法是创建一个包装器来包装EntityC,它也可以携带附加信息。
public class EntityCWrapper implements EntityC, AdditionalInfo { ...}

或者使用转移对象作为简单的数据结构:
public EntityTO {
  public EntityC entity;
  public AdditionalInfo info;
}

但是,如果服务返回一个实体A实例的列表,并且我们需要将AdditionalInfo附加到实例图中的所有实体(包括实体B和实体C的引用实例)怎么办?

有没有任何想法或者能够指出适用于这种情况的设计模式的人?


什么是 "EntityA -1---n-> EntityB -1---n-> EntityC"? - Kashyap
只是一个对象图示例,可能类似于:分类拥有多个物品,每个物品有多个物品详细信息。 - sprehn
1
顺便说一句,第一个想法可以使用 装饰器模式 很好地实现。 - sprehn
3个回答

1

看看角色对象模式

它描述了如何使用不同的内容(称为角色)扩展对象。该模式更多地涉及如何添加业务逻辑(这就是为什么它被称为角色),但也许这个想法能帮到你。


这是一个很好的提示。在这种情况下,图中的类需要准备这样的接口,以便可以添加、删除和查询行为。我想这不会太过于侵入性(就像实现访问者模式所需的准备工作一样)。对于这个额外的信息用例,不需要将委托返回到核心对象。 - sprehn
这个东西被称为扩展对象模式 :-) - sprehn
@sprehn 你说得对,扩展对象模式是我正在寻找的第二个模式,但我忘记了它的名称。 - Ralph

0

所以你的数据模型基本上是使用以下对象作为示例(虽然有些牵强)的1到n

class Thing  
{  
   Collection<DooDad> dooDads;
}    

class DooDad  
{  
   Collection<DooDadDetail> details;  
}  

class DooDadDetail  
{  
   ... 
}  

因此,我会将其视为我的模型,就 n 层架构而言,因此这应该与我的数据库完全对应。所要做的是创建一个由 Thing 组成的对象,它可以与业务逻辑或外部服务进行交互。在这种情况下,创建传输对象是正确的,因为它确保您的模型保持有效,并且您和外部服务之间的接口不依赖于您的模型。这有点像是一个 Facade 模式和数据传输对象。


0
假设AdditionalInfo是实例特定的(即,每个EntityC实例与一个AdditionalInfo实例有唯一的121关系),最好的选择是增强EntityC定义,将AdditionalInfo作为其成员之一包含在内,这是可选的,并由您填写。
如果您无法控制EntityC,那么在您给出的两个选项之间,我会说TransferObject似乎更好。这样你就不必创建新的EntityC对象了。

我看过一些解决方案,其中实体被增强了,就像这样(这可能是最简单的方法)。然而,在某些情况下,这并不适合,因为它会破坏层架构。因此,我的问题是在这种情况下我们还能做什么。 - sprehn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接