2017-03-06 69 views
0

我正在爲考試做這個小項目。我的老師關注這個uml,所以我的問題是關於我的項目中的聚合和關聯(我知道這是一個問了很多次的問題)。 該項目是一個全局觀察者,它具有Component的集合,並且每當Component(Leaf或Composite)改變其狀態時,都會通知觀察者。我的問題是關於ConcreteObserver和Component之間的聚合的正確性:ConcreteObserver有一個Component的集合,但每個Component都有一個對觀察者的引用(在Leaf和Composite中有一個觀察者)。也許我應該添加關聯組件 - > ConcreteObserver? 也許我應該改變聚合ConcreteObserver 1 - > *元件爲關聯關係ConcreteObserver1 - > *的COMUml關於我的項目中的關聯和聚合

這裏是UML enter image description here

,這裏是我的項目的整個代碼,我知道這是很長,但你要注意混凝土觀察員和混凝土構件(複合) (我不把葉,因爲它是非常相似的複合卻一直沒有孩子有關的方法來實現) 這裏是組件

//Component 
public interface Component { 
    public void op(); 
    public void add(Component c); 
    public void remove(Component c); 
    public List <Component> getChild(); 
    public void setState(int x); 
    public int getState(); 
    public String getName(); 
} 


//Composite 
public class Composite implements Component { 
    private int state; 
    private String name; 
    private Observer observer; 
    private List <Component> comps = new ArrayList <Component>(); 

    public Composite(String name, Observer observer){ 
     this.name = name; 
     this.observer = observer; 
     this.observer.add(this);    
    } 

    @Override 
    public void setState(int x){ 
     this.state = x; 
     observer.update(name); 
    } 

    @Override 
    public int getState(){ 
     return state; 
    } 

    @Override 
    public String getName(){ 
     return name; 
    } 

    @Override 
    public void op() { 
     System.out.println("sono una foglia"); 
    } 

    @Override 
    public void add(Component c) { 
     comps.add(c); 
    } 

    @Override 
    public void remove(Component c) { 
     comps.remove(c); 
    } 

    @Override 
    public List<Component> getChild() { 
     List <Component> cc = new ArrayList <Component>(); 
     for (Component zen : comps){ 
      cc.add(zen); 
     } 
     return cc; 
    } 
} 


//Observer 
public abstract class Observer { 
    public abstract void update(String name);  
    public abstract void add(Component c); 
} 


//ConcreteObserver 
public class ConcreteObserver extends Observer { 
    private List <Component> components = new ArrayList <Component>(); 

    @Override 
    public void update(String name){ 
     for(Component zen : components){ 
      if(zen.getName()==name){ 
       System.out.println("the state of " + name + " is changed, now it's " + zen.getState()); 
      } 
     } 
    } 

    @Override 
    public void add(Component c){ 
     components.add(c); 
    } 

    public void printAllState(){ 
     for(Component zen : components){ 
      System.out.println("the state of " + zen.getName() + " is " + zen.getState()); 
     } 
    } 
} 


//main 
public class Compito24Febbraio2017 { 
    public static void main(String[] args) { 
     ConcreteObserver o = new ConcreteObserver(); 
     Composite c1 = new Composite ("c1",o); 
     Leaf l1 = new Leaf("l1",o); 
     Leaf l2 = new Leaf("l2",o); 
     c1.add(l1); 
     c1.add(l2); 
     c1.setState(5); 
     l1.setState(4); 
     o.printAllState(); 
    } 
} 

回答

0

只是不關心那些共享的聚合。如果他們離開,或者他們在那裏,就忽略它們。 UML規範說(p。110):

指示該屬性具有共享聚合語義。精確的共享聚合語義因應用領域和建模者而異。

這實際上意味着:它沒有具體的含義。

編輯爲您的評論:代表關係的首選方法是這樣的:

enter image description here

您在協會,而不是類型的屬性的另一側用角色名。

+0

我真的不明白,我不得不忽略聚合?所以我必須消除ConcreteObserver和Component之間的聚合? –

+0

如果它存在與否,沒有區別。共享聚合沒有商定的語義。 –

+0

這是因爲我在ConcreteObserver中放置了一個組件集合,所以聚合有點冗餘嗎? –