2017-03-06 10 views
0

시험을 위해이 작은 프로젝트를하고 있습니다. 나의 선생님은 uml에 대해 관심을 가지기 때문에 내 문제는 집계와 연관성에 관한 것입니다. (저는 이것이 많은 시간을 물어 보는 질문입니다). 프로젝트는 Component 컬렉션이있는 글로벌 옵저버이며 Component (Leaf 또는 Composite)가 상태를 변경할 때마다 관찰자에게 알립니다. 내 질문에 ConcreteObserver 및 구성 요소 간의 집계의 정확성에 대한 것입니다. ConcreteObserver 컬렉션의 구성 요소가 있지만 각 구성 요소는 관찰자에 대한 참조가 있습니다 (리프 및 합성에서 관찰자가 있음). 아마 내가 Component-> ConcreteObserver라는 관계를 추가해야 할까? 협회 ConcreteObserver1에> * 구성 요소 - - 어쩌면 나는 집계 ConcreteObserver 1을 변경해야합니다> * 컴 여기프로젝트의 연관과 집계에 관한 Uml

은 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 사양 (0120) :

속성에 집계 의미가 있음을 나타냅니다. 공유 집계의 정확한 의미는 응용 분야와 모델러에 따라 다릅니다.

이는 실제로 의미가 없음을 의미합니다. 귀하의 코멘트에 관해서

편집 : 관계를 표현하는 가장 좋은 방법은 이것이다 :

enter image description here

당신은 협회가 아닌 입력 속성의 반대 측에 역할 이름을 사용합니다.

+0

정말 이해가 안되는데, 나는 집계를 무시해야합니까? 그래서 ConcreteObserver와 Component 사이의 집계를 제거해야합니까? –

+0

존재 여부는 차이가 없습니다. 공유 집계에는 합의 된 의미가 없습니다. –

+0

이것은 ConcreteObserver에 컴포넌트 콜렉션을 넣었 기 때문에 집계가 약간 중복되었습니다. –