在容器和元素之间触发事件的解决方案?

时间:2017-01-16 07:14:20

标签: java oop design-patterns

我有一个这样的课程:

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关系不相近

2 个答案:

答案 0 :(得分:1)

如果您真的想这样做,可以使用观察者模式(https://en.wikipedia.org/wiki/Observer_pattern)。然后,可以通知您的Graph类(观察者)关于添加到其组成节点(主体)的关系。

那就是说,我建议你改变你的设计。通常,图形不是设计为包含所有图形数据的单个类。修复“添加”问题后,您将面临删除节点的相同问题。那么将图形的整个部分从一个节点移动到另一个节点呢?维护重复信息(因为这就是你正在做的事情:节点类拥有你需要的一切)真的很痛苦。

您应该选择具有两个子项具体类NodeLeaf的抽象代数数据类型(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);
    }
}