这两个关系之间有什么区别?
编辑:如果您能提供一个简单的代码示例来说明区别,那将非常有帮助!
这两个关系之间有什么区别?
编辑:如果您能提供一个简单的代码示例来说明区别,那将非常有帮助!
我试图给出两种类型线的简单例子。
在第一个图中,实线表示关联:
如果这些类在Java中声明,那么就像 ClassA
将 ClassB
存储为属性引用(可以通过构造函数传递、创建等方式)。例如:
public class ClassA {
ClassB theClassB = ...
...
}
在第二个图表中,展示了一种依赖关系:
依赖关系比关联关系要弱得多。引用自《UML Distilled》:public class ClassA {
...
public void someMethod(ClassB arg1) {...}
...
public void someOtherMethod() {
ClassB localReferenceToClassB = ...
}
...
}
以下是ClassA
未使用关联关系而依赖于ClassB
的其他方法(不是详尽列表):
ClassB
具有一个静态方法,ClassA
调用该方法ClassA
捕获类型为ClassB
的异常ClassB
时,ClassA
也必须进行修改(例如,某些逻辑被共享)你的问题给了我一个学习自己的好机会,下面是我发现的 -
关联(Association):拥有另一种类型的所有权(例如,“A”拥有“B”)
//@assoc The Player(A) has some Dice(B)
class Player {
Dice myDice;
}
依赖关系:使用另一种类型(例如,“C” 使用了“D”)
//@dep The Player(C) uses some Dice(D) when playing a game
class Player {
rollYahtzee(Dice someDice);
}
我找到了一篇简明易懂的参考资料- Association vs. Dependency
这个网页应该已经说得够清楚了,以下文字摘自该网页,足以理解二者的区别。
简单来说,实线表示关联(association),虚线/点线表示依赖关系(dependency)。
关联也可以是单向的,其中一个类知道与另一个类的关系,但另一个类却不知道。这种关联需要一个开放箭头来指向已知的类,只有已知的类才能拥有角色名称和多重性。在本例中,Customer 类知道任意数量的产品购买,但 Product 类不知道任何客户。多重性“0..*”表示零或多个。
依赖是两个类之间的一种弱关系,用虚线表示。在本例中,Point 和 LineSegment 之间存在依赖关系,因为 LineSegment 的 draw() 操作使用 Point 类。它表示即使没有该类型的属性,LineSegment 也必须知道 Point。该示例还说明了类图如何集中显示上下文中重要的内容,因为您通常不想显示所有类操作的详细依赖关系。
由于我的声望值只有8点,我不能直接上传图片,但您可以在我上面提到的网页上查找。
[编辑]
我这里没有代码示例,但是我个人认为这就像一辆汽车和一个门。当一辆车有门(或更多)时,它就是一辆车。
Car --- has a --> 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);
}
}
所以,这就是我们通常在代码中实现此操作的方式!如果您是编程新手,则通常不需要不同类型的线条和箭头。保持简单。
箭头2:依赖关系
好的,我们知道关于通常情况下使用的普通关联。但是什么时候才会使用“依赖性”箭头呢?那么,让我们定义一下依赖(维基百科):
Dependency is a weaker form of bond which indicates that one class depends on
another because it uses it at some point in time. One class depends on
another if the independent class is a parameter variable or local variable of
a method of the dependent class. This is different from an association, where
an attribute of the dependent class is an instance of the independent class.
Sometimes the relationship between two classes is very weak. They are not
implemented with member variables at all. Rather they might be implemented as
member function arguments.
如果存在一个连接、关系、关联等需要存在于classA才能工作的情况,那就是一种依赖关系。例如:丈夫需要妻子才能存在。汽车需要轮子才能成为汽车(并行驶)。汽车工厂需要汽车类才能从中制造出对象。您的RSSNewsItem类需要一个XMLReader类才能做任何事情。
什么时候使用哪个?
好吧,在我看来,这是唯一有效的问题;因为谷歌显示了很多关于您问题的有效答案。尽量不要在类图中使用依赖关系,因为这通常意味着您不够具体。始终以关联、实现等为目标。仅在必须使用其他类而又不必维护关系时(例如实用程序类(如XMLReader)),才使用实现(在我看来)。
阅读完整说明后,如果您有任何问题,请随时问。 :-)
虚线表示实现(接口) 实线表示继承(基类)
ClassB
对象的范围进行区分:对于关联,它具有类级别的作用域,而另一个仅具有方法级别的作用域。 - VimNing