如果我有两个实体,Parent
和Child
,则Parent
需要了解其所有Child
子项,并且每个Child
实例都需要知道它的父Parent
实例,我该如何正确地做到这一点(就DDD等而言)?
简单的方法是parent.addChild(new Child(parent))
,但这看起来很难看 - 以及:
parent.addChild(new Child()); // Then call some setParent method on child, which needs to be public
我需要在这里使用工厂吗?如果是这样,怎么样?
由于
答案 0 :(得分:2)
一种选择是在Parent类上使用相关的实例方法。由于您在现有对象上操作并且只需要将对象与另一个对象连接,因此可能不需要静态工厂。
public class Parent {
// ...
public Child createChild() {
Child c = new Child(this);
this.addChild(c);
return c;
}
protected void addChild(c) {
// ...
}
// ...
}
public class Child {
public Child(Parent p) {
// ...
this.addParent(p);
}
protected addParent(Parent p) {
// ...
}
}
如果Child构造函数需要参数,则可以将这些参数传递给createChild
方法。
答案 1 :(得分:2)
您不仅限于单一方法。你应该使用适合你的方法。
在SWT中,子项与构造函数中的父项链接:
new Label(parentComposite, SWT.NONE);
之后,parentComposite知道它的孩子。
注意:SWT要求创建父级,这限制了某些功能 - 如果不指定子级,则无法创建子级。这是SWT的限制。
在Swing中,您可以创建子窗口小部件,然后将其添加到父窗口。
以上只是示例。您的个人解决方案将基于您的需求。
我会考虑使用更少的方法,更多的一致性(不要让你的孩子与父母取消联系)
谈论代码我将使用以下方法:
Parent {
addChild(Child child) {
children.add(child);
child.setParent(this);
}
}
希望有所帮助。快乐的设计!
答案 2 :(得分:2)
如何做这样的事情:
public class Child {
Child (Parent parent) {
...
this.parent = parent;
parent.addChild(this);
}
}
因此,您可以在创建子项时将父项设置为Child。