Language agnostic UML关系-虚线与实线

Language agnostic UML关系-虚线与实线,language-agnostic,uml,relationship,class-diagram,Language Agnostic,Uml,Relationship,Class Diagram,这两种关系之间的区别是什么 编辑:如果您能提供一个简单的代码示例来说明差异,那将非常有用 这个网页说得够多了,我想: 下面的文本来自它,但我认为应该足以理解其中的差异 因此,基本上,实线是一种关联,虚线/虚线是一种依赖关系 关联也可以是单向的,其中一个类知道 另一个类和关系,但另一个类没有。 这种关联需要一个开放的箭头来指向 是已知的,并且只有已知的类可以有角色名和 多种多样在本例中,Customer类知道任何 已购买但Product类不知道的产品数 任何顾客。多重性“0..*”表示零或更多

这两种关系之间的区别是什么


编辑:如果您能提供一个简单的代码示例来说明差异,那将非常有用

这个网页说得够多了,我想: 下面的文本来自它,但我认为应该足以理解其中的差异

因此,基本上,实线是一种关联,虚线/虚线是一种依赖关系

关联也可以是单向的,其中一个类知道 另一个类和关系,但另一个类没有。 这种关联需要一个开放的箭头来指向 是已知的,并且只有已知的类可以有角色名和 多种多样在本例中,Customer类知道任何 已购买但Product类不知道的产品数 任何顾客。多重性“0..*”表示零或更多

依赖关系是两个类之间的弱关系,是 用虚线表示。在本例中,存在一个依赖项 在点和线段之间,因为线段的draw()操作 使用Point类。它表示线段必须知道 点,即使它没有该类型的属性。这个例子也 说明如何使用类图来关注 在上下文中很重要,因为您通常不想显示这样的内容 所有类操作的详细依赖项

由于我的声誉只有8,我无法放置图像本身,但它们仍然可以在我开始提到的网页上找到

[编辑]

我这里没有代码示例,但我个人如何解释它就像一辆车和一扇门一样简单

当一辆车有门(或更多)时,它只是一辆车

Car --- has a --> Door
但是,当您有一个可以打开的门时,door类将具有如下函数

public void openDoor(){
this.open();
}
要使用上述功能,汽车必须创建门的实例

Class Car(){
Door door1 = new Door();

door1.open();
}
这样就创建了一个依赖项

因此,实线只是将一个对象(1)指向另一个对象(2),但当您开始使用该对象(1)时,它将成为一个依赖项


我希望这样就可以了;)

好吧,既然你没有接受第一个答案;让我试试

箭头1:正常关联

UML有不同类型的线和箭头。上面是简单的关联箭头,这意味着一个类可以链接到另一个类。下面我将用代码示例解释每种类型

  • 在第一个示例中,您可以看到没有真正指定谁知道谁(谁是关系的所有者)。动物能认识人,人能认识动物。它没有指定,因此对程序员没有真正的帮助
  • 在第二个例子中,艺术家可以拥有一把吉他。因为有一支箭,而另一边没有,我们知道吉他不认识艺术家。吉他是一种完全可以独立存在的物体,不需要任何人
  • 在第三个例子中,你看到了婚姻。真的很简单;丈夫认识妻子,妻子认识丈夫。在我们的情况下,丈夫只有一个妻子,反之亦然
我们通常如何在代码中实现这一点

class Husband{
    Wife bestWomanInTheWorld;

    public Husband(Wife theWife){
        this.bestWomanInTheWorld = theWife;
    }
}
因为丈夫总是需要妻子,所以我们将所需的关系放入构造函数中。因为艺术家可以拥有吉他,所以我们会将构造函数保留为空,如下所示:

class Artist{
    List<Guitar> guitars;

    public Artist(){
    }

    public AddGuitarToCollection(Guitar newGuitar){
        Guitars.Add(newGuitar);
    }
}
如果有需要出席的联系、关系、协会等,请a班工作;这是一种依赖。例:丈夫需要妻子存在。汽车需要一个轮子才能成为汽车(和驾驶)。汽车工厂需要一个汽车类来从中制造对象。RSSNewsItem类需要一个XMLReader类来执行任何操作

什么时候使用哪个?

这是我眼中唯一正确的问题;因为谷歌对你的问题给出了很多有效的答案。尽量不要在类图中使用依赖项,因为它通常意味着您不够具体。始终以关联、实现等为目标。仅当需要使用其他类而不维护关系时才使用实现(在我看来)。例子;实用程序类(如XMLReader)

如果您在阅读本完整解释后有任何问题,请随时提问。:-)

虚线表示工具(接口)
solid-means扩展(一个基类)

我试图给出两种类型的线的简单示例

在第一张图中,实线显示了关联:

如果类是用Java声明的,这就像
ClassA
将对
ClassB
的引用存储为一个属性(它可以传递给构造函数、创建等等)。因此,您可能会看到如下内容:

public class ClassA {
    ClassB theClassB = ...
    ...
}
在第二个图中,它显示了一个依赖关系:

依赖关系比关联弱得多。引用UML的话:

对于类,依赖关系的存在有多种原因:一个类向另一个类发送消息;一个类将另一个类作为其数据的一部分;一 类将另一个作为操作的参数。[…]您使用依赖项 只要您想显示一个元素中的更改可能如何改变其他元素

同样,使用Java,有两个例子:一个
ClassB
类型的参数被传递给一个方法,或者一个方法声明一个
ClassB
类型的局部变量:

public class ClassA {
    ...
    public void someMethod(ClassB arg1) {...}
    ...
    public void someOtherMethod() {
        ClassB localReferenceToClassB = ...
    }
    ...
}
其他方式
ClassA
可以依赖于
ClassB
,而无需关联(不是详尽的列表):

  • ClassB
    有一个静态方法,
    ClassA
    调用
  • ClassApublic class ClassA {
        ...
        public void someMethod(ClassB arg1) {...}
        ...
        public void someOtherMethod() {
            ClassB localReferenceToClassB = ...
        }
        ...
    }
    
    //@assoc  The Player(A) has some Dice(B)
    class Player {
        Dice myDice;
    }
    
    //@dep    The Player(C) uses some Dice(D) when playing a game
    class Player {
        rollYahtzee(Dice someDice);
    }