开始学习UML类图中的类与类之间的关系中的时候,其中依赖,组合和聚合关系比较容易混淆,下面我以代码和类图的形式将这些关系呈现出来。希望能够对困惑者有所帮助。
我使用的建模工具为powerdesigner。
关联是一种结构化的关系,指一种对象和另一种对象有联系。给定有关联的两个类,其中一个类的对象包含另一个类的对象,关联有单向关联和双向关联。
多重性关联关系
多重性关联关系又称为重数性关联关系,表示一个类的对象与另一个类的对象连接的个数。在UML中多重关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数
聚合关系指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类(容器类)和成员类之间就形成了聚合关系。在聚合关系中,类A是类B的一部分,但是类A可以独立存在,在UML中,聚合关系用带空心菱形的直线表示。
组合关系也表示类之间整体和部分的关系,但是组合关系中部分和整体具有相同的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有共生死的关系。在组合关系中,类A包含类B,而且可以控制类B的生命周期。类A控制类B的生命周期意味着类B的存在依赖于类A。在UML中,组合关系用带实心菱形的直线表示。
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,反之不成立,在需要表示一个事物使用另一个事物时使用依赖关系。通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。在UML中也可以在其他的事物之间使用依赖关系,如节点之间的关系。依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
(一)
(1)
public class A {
/** @pdRoleInfo migr=no name=B assc=association1 mult=1..1 type=Aggregation */
public B b;
}
/** @pdOid 8f2cf0c8-d0d0-4b51-86f6-e2f63840b77f */
public class B {
}
(2)
/** @pdOid fe9426ca-b27b-4398-855c-e925f7d97e4a */
public class C {
/** @pdRoleInfo migr=no name=D assc=association2 coll=java.util.Collection impl=java.util.HashSet mult=0..* type=Aggregation */
public java.util.Collection<D> d;
/** @pdGenerated default getter */
public java.util.Collection<D> getD() {
if (d == null)
d = new java.util.HashSet<D>();
return d;
}
/** @pdGenerated default iterator getter */
public java.util.Iterator getIteratorD() {
if (d == null)
d = new java.util.HashSet<D>();
return d.iterator();
}
/** @pdGenerated default setter
* @param newD */
public void setD(java.util.Collection<D> newD) {
removeAllD();
for (java.util.Iterator iter = newD.iterator(); iter.hasNext();)
addD((D)iter.next());
}
/** @pdGenerated default add
* @param newD */
public void addD(D newD) {
if (newD == null)
return;
if (this.d == null)
this.d = new java.util.HashSet<D>();
if (!this.d.contains(newD))
this.d.add(newD);
}
/** @pdGenerated default remove
* @param oldD */
public void removeD(D oldD) {
if (oldD == null)
return;
if (this.d != null)
if (this.d.contains(oldD))
this.d.remove(oldD);
}
/** @pdGenerated default removeAll */
public void removeAllD() {
if (d != null)
d.clear();
}
}
public class D {
}
/** @pdOid fed71090-8e24-4c11-8e21-6d81f0accf97 */
public class H {
}
public class G {
/** @pdRoleInfo migr=no name=H assc=association4 mult=1..1 type=Aggregation */
public H h;
}
(二)
(1)
public class A {
/** @pdRoleInfo migr=no name=B assc=association1 mult=1..1 */
public B b;
}
public class B {
}
(2)与上面C和D的代码类似
(3)
public class E {
/** @pdRoleInfo migr=no name=F assc=association3 mult=0..1 */
public F f;
}
/** @pdOid 2981ae48-b4c0-4a54-918d-1886312657be */
public class F {
}
(4)依赖关系:
/** @pdOid 23a21238-0ca0-458a-866f-14032ebfc752 */
public class G {
}
/** @pdOid 48fdcbf8-5523-4eed-9ee9-ea8ca7b23a38 */
public class H {
}
(三)
关联包含了组合和聚合,又分单向关联和双向关联;
依赖:对象作为方法参数,对象作为局部变量,调用类的静态方法。
(四)看如下代码:
package s;
//A和B之间为聚合关系
public class A {
private B b;
public A(B b){
this.b = b;
}
}
package s;
//C和B之间为组合关系
public class B {
private C c;
public B(){
c = new C();
}
}
package s;
//C和D之间为依赖关系
public class C {
public void method(D d){
d.m();
}
}
package s;
public class D {
public void m(){
}
}
package s;
import java.util.List;
//E和D之间为聚合关系
public class E {
private List<D> list;
public void m(){
}
public List<D> getList() {
return list;
}
public void setList(List<D> list) {
this.list = list;
}
}
package s;
//F和E之间为依赖关系
public class F {
public void m(){
E e = new E();
e.m();
}
}
但生成的类图却是这样: