我有一个这样的课程:
public class Graph {
Map<NodeKey,Node> nodes;
List<RelationKey,Relation> relations;
public void addNode(Node node){
nodes.put(node.key,node);
}
public void addRelation(Relation relationship){
relations.add(relation.key,relation);
}
//getter and setter
}
public class Node {
Map<RelationKey,Relation> relations;
public void addRelationship(Relation relation){
relations.put(relation.key,relation);
}
//getter and setter
}
图形如何调用它的方法:调用node.addRelationship(关系关系)时的addRelation(关系关系)。我可以在类Node中添加Graph属性,但它似乎与OOP中的HAS-A关系不相近
答案 0 :(得分:1)
如果您真的想这样做,可以使用观察者模式(https://en.wikipedia.org/wiki/Observer_pattern)。然后,可以通知您的Graph
类(观察者)关于添加到其组成节点(主体)的关系。
那就是说,我建议你改变你的设计。通常,图形不是设计为包含所有图形数据的单个类。修复“添加”问题后,您将面临删除节点的相同问题。那么将图形的整个部分从一个节点移动到另一个节点呢?维护重复信息(因为这就是你正在做的事情:节点类拥有你需要的一切)真的很痛苦。
您应该选择具有两个子项具体类Node
和Leaf
的抽象代数数据类型(https://en.wikipedia.org/wiki/Algebraic_data_type)。然后,您可以浏览图表以执行您需要的任何操作。看看树,这是一种特别类型的图表,真正有很好的记录。实际上,它们在我刚才提供的链接中作为示例引用。
答案 1 :(得分:1)
你可以像这样使用Observer模式:
class Node extends Observable {
public Node(Observer observer){
addObserver(observer);
}
public void addRelationship(Relation relation){
relations.put(relation.key,relation);
setChanged();
notifyObservers(relation);
}
}
class Graph implements Observer {
@Override
public void update(Observable o, Object arg) {
Relation relation = (Observable)arg;
relations.add(relation.key,relation);
}
}