2017-01-16 47 views
1

我有這樣一個類:在容器和元素之間觸發事件的解決方案?

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 
} 

如何可以繪製調用它的方法:addRelation(關聯關係)時node.addRelationship(關聯關係)被調用。我可以在類Node中添加Graph屬性,但它看起來並不接近於OOP中的HAS-A關係。

+0

Graph對象已經知道它的節點關係,是什麼關係圖表屬性的目的是什麼? – Francesco

+0

@Francesco:你說得對。但是對於找到修改關係或生成JSON用於可視化和安排需求(如最小交叉線)時的高性能。 – gianglaodai

+0

@Francesco:另外,當新的關係被添加到一個節點時,新的節點應該被添加到圖中。 – gianglaodai

回答

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); 
    } 
} 
1

如果您確實想這樣做,可以使用觀察者模式(https://en.wikipedia.org/wiki/Observer_pattern)。然後,你的類(觀察者)可以被通知添加到其組成節點(主題)的關係。

這就是說,我建議你改變你的設計。通常情況下,圖不是用一個包含所有圖形數據的類來設計的。一旦解決了「添加」問題,您將面臨同樣的問題來刪除節點。那麼將整個圖形的一部分從一個節點移動到另一個節點呢?維護重複信息(因爲這就是你所做的事情:節點類擁有你需要的一切)真的很痛苦。

你可能應該去抽象代數數據類型(https://en.wikipedia.org/wiki/Algebraic_data_type)與兩個子類具體類NodeLeaf。然後你可以探索你的圖表來做你需要的任何事情。看看樹,這是一種特別有用的圖形,它們有很好的文檔記錄。事實上,它們在我剛剛提供的鏈接中作爲示例參考。

+0

感謝您的諮詢。我會盡力改變我的設計 – gianglaodai

相關問題