关于我项目中的关联和聚合的 Uml

Posted

技术标签:

【中文标题】关于我项目中的关联和聚合的 Uml【英文标题】:Uml about the association and the aggregation in my project 【发布时间】:2017-07-26 06:49:35 【问题描述】:

我正在为考试做这个小项目。我的老师关注 uml,所以我的问题是关于我项目中的聚合和关联(我知道这是一个被问了很多次的问题)。 该项目是一个全局观察者,它有一个组件集合,每次组件(叶或复合)改变其状态时,它都会通知观察者。我的问题是关于 ConcreteObserver 和 Component 之间聚合的正确性:ConcreteObserver 有一个 Component 的集合,但是每个 Component 都有一个对观察者的引用(在 Leaf 和 Composite 中有一个观察者)。也许我应该添加一个关联 Component->ConcreteObserver? 也许我应该将聚合 ConcreteObserver 1->* 组件更改为关联 ConcreteObserver1->*Com

这里是 uml

这是我项目的全部代码,我知道它很长,但你必须注意具体观察者和具体组件(复合) (我没有放叶子,因为它与 Composite 非常相似,但它没有实现与 children 相关的方法) 这是组件

//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();
    

【问题讨论】:

【参考方案1】:

只是不关心那些共享聚合。离开它们,或者如果它们在那里,就忽略它们。 UML 规范说(第 110 页):

表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。

这实际上意味着:它没有特定的含义。

编辑您的评论:表示关系的首选方式是:

您在关联的另一端使用角色名称而不是类型属性。

【讨论】:

真的不懂,要不要忽略聚合?所以我必须消除 ConcreteObserver 和 Component 之间的聚合? 它是否存在没有区别。共享聚合没有约定的语义。 这是因为我在 ConcreteObserver 中放了一个组件的集合,所以聚合有点多余吧? 好的我现在明白了,共享聚合链接可以通过关联更改,聚合就像安慰剂一样。我们永远不能使用聚合而总是使用关联(不是相反)。这个链接照亮了我aviadezra.blogspot.it/2009/05/… 顺便再写一次,因为我认为我的类Diagram中有一些冗余信息。 ConcreteObserver 有一个私有的 Component 集合,所以它是一个一对多的关联有点多余。我应该摆脱收藏,只留下一对多的关联。我说的对吗?

以上是关于关于我项目中的关联和聚合的 Uml的主要内容,如果未能解决你的问题,请参考以下文章

UML 聚合与关联

UML类关系(依赖,关联,聚合,组合,泛化,实现)

架构漫谈:UML中几种类间关系:继承实现依赖关联聚合组合的联系与区别

UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)

UML 表示法 - 聚合/组合与“普通”关联

UML中的6大关系(关联依赖聚合组合泛化实现)