Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时使用附加信息增强Java中现有数据结构的设计模式_Java_Oop_Design Patterns - Fatal编程技术网

在运行时使用附加信息增强Java中现有数据结构的设计模式

在运行时使用附加信息增强Java中现有数据结构的设计模式,java,oop,design-patterns,Java,Oop,Design Patterns,我将从一个小例子开始: 假设一个应用程序有几个实体 EntityA-1--n->EntityB-1--n->EntityC 假设我们有一个服务方法,它返回EnityC实例列表。在UI中,我们希望显示EntityC,但也要向实体添加一些仅与UI相关的附加信息(可能是css类或其他)。解决这个问题的一种常见方法是在EntityC周围创建一个包装器,该包装器也可以携带附加信息 public class EntityCWrapper implements EntityC, AdditionalInfo

我将从一个小例子开始:

假设一个应用程序有几个实体

EntityA-1--n->EntityB-1--n->EntityC

假设我们有一个服务方法,它返回EnityC实例列表。在UI中,我们希望显示EntityC,但也要向实体添加一些仅与UI相关的附加信息(可能是css类或其他)。解决这个问题的一种常见方法是在EntityC周围创建一个包装器,该包装器也可以携带附加信息

public class EntityCWrapper implements EntityC, AdditionalInfo { ...}
或者可以使用传输对象作为简单的数据结构:

public EntityTO {
  public EntityC entity;
  public AdditionalInfo info;
}
但是,如果服务返回一个EnitityA实例列表,并且我们需要将附加信息附加到实例图中的所有实体(包括EntityB和EntityC的引用实体实例),该怎么办


是否有人有想法或可以为我指出适合这种情况的设计模式?

假设
AdditionalInfo
是特定于实例的(即
EntityC
的每个实例都与
AdditionalInfo
实例有唯一的121关系)最好的选择是增强
EntityC
定义,将
AdditionalInfo
包含在其中作为成员/…,这是可选的,由您填写


如果您不能控制
EntityC
,那么在您给出的两个选项之间,我会说TransferObject似乎更好。您不必以这种方式创建新对象(属于
EntityC
)。

因此,以以下对象为例,您的数据模型基本上是1到n的(尽管可能是精心设计的)

类的东西
{  
收集涂鸦;
}    
杜达班
{  
收集详情;
}  
类详细信息
{  
... 
}  
因此,我将把它作为我的模型,在n层体系结构方面,因此它应该准确地映射回我的数据库。接下来你想让你的模型做点什么,不管是什么。所以您应该创建一个对象,该对象由可以与业务逻辑或外部服务交互的对象组成。在这种情况下,创建传输对象是正确的,因为它可以确保您的模型保持有效,并且您和外部服务之间的接口不依赖于您的模型。它是一种门面模式和一个数据传输对象。

看一下

它描述了如何用不同的东西(称为角色)扩展对象。
该模式更多的是关于如何添加业务逻辑(这就是为什么它被称为角色),但这个想法可能会对您有所帮助。

什么是“EntityA-1--n->EntityB-1--n->EntityC”?仅仅是一个对象图的示例,可能是这样的:类别有许多项有许多项细节SBTW。第一个想法可以通过使用模式来实现。我见过这样增强实体的解决方案(这可能是最简单的方法)。但是,在某些情况下,这是不合适的,因为它会破坏层结构。所以我的问题是在这种情况下我们还能做些什么。这是一个很好的暗示。在这种情况下,图形中的类需要准备一个可以添加、删除和查询行为的接口。我想这不是太打扰。(与实现访问者模式所需的准备工作非常相似)。对于这个额外的信息用例,不需要委托回核心对象。这个东西叫做:-)@sprehn你是对的,扩展对象模式是我搜索的第二个模式,但我忘记了它的名称。
class Thing  
{  
   Collection<DooDad> dooDads;
}    

class DooDad  
{  
   Collection<DooDadDetail> details;  
}  

class DooDadDetail  
{  
   ... 
}