Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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_Nested_Object Model - Fatal编程技术网

在java中支持嵌套对象模型的最佳方式是什么?

在java中支持嵌套对象模型的最佳方式是什么?,java,nested,object-model,Java,Nested,Object Model,我需要支持UI客户端,它有嵌套的组件。我提出了以下对象模型- public class SomeUserInterface { String name; List<Component> components; } public class Component { List <Component> components; } 公共类SomeUserInterface{ 字符串名; 列出组件; } 公共类组件{ 列出

我需要支持UI客户端,它有嵌套的组件。我提出了以下对象模型-

public class SomeUserInterface { 
        String name;
        List<Component> components;  
}
public class Component {
        List <Component> components;  
}
公共类SomeUserInterface{
字符串名;
列出组件;
}
公共类组件{
列出组件;
}
在这里,SomeUserInterface将有多个组件,每个组件中可能有嵌套的组件。 提议的对象模型中是否存在任何问题?或者,支持嵌套组件的最佳方式是什么


注意:SomeUserInterface和Component不是相同的类。SomeUserInterface可以包含组件,但反之亦然。

组件和容器都可以包含组件。如果它们提供相同的添加/删除等方法,则它们应继承自一个共同的祖先:

public class ComponentHolder {
    List<Component> components;
}

public class Component extends ComponentHolder {
    // ...
}

public class Container extends ComponentHolder {
    String containerName;
    // ...
}
公共类组件持有者{
列出组件;
}
公共类组件扩展了ComponentHolder{
// ...
}
公共类容器扩展了ComponentHolder{
字符串容器名称;
// ...
}
编辑:另一种可能是使用构图。这样,您的类就不需要一个共同的祖先,但仍然使用相同的组件列表实现。如果决定更改组件的存储方式,则只能在一个位置执行

public class ComponentHolder {
    List<Component> components;
    // add, remove, get, ...
}

public class Component {
    ComponentHolder content;
    void add(Component c) {
        content.add(c);
    }
    // ...
}

public class Container {
    String containerName;
    ComponentHolder content;
    // ...
}
公共类组件持有者{
列出组件;
//添加、删除、获取。。。
}
公共类组件{
成分含量;
无效添加(组件c){
内容.添加(c);
}
// ...
}
公营货柜{
字符串容器名称;
成分含量;
// ...
}

容器和组件之间的区别是什么?为什么有两个明显相同的类?不要将它们定义为类,让它们成为接口。它使您的继承模型在将来更加灵活。@AndyTurner-这是示例实现。是的,会有接口。@肉桂-你能详细说明一下吗?这叫做“我已经编辑了我的问题”(代码以及添加了注释)。在您的示例中,容器本身是一个组件,但事实并非如此。这似乎很有用,但如何通过公共父级(即ComponentHolder)链接两个逻辑上不相关的类,如容器和组件?@PST即使它们在其他方面不相关,它们也共享保存组件的能力,可能还有一些方法,如
添加
删除
和其他。如果您不想从公共基类继承,您仍然可以让它们实现一个公共接口,该接口将指定一个对象具有组件保持功能。@PST如果您根本不想让它们具有公共祖先,但仍然希望共享该功能,您可以使用组合(请参阅我的编辑)。