Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57787
  • 博文数量: 19
  • 博客积分: 1560
  • 博客等级: 上尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-28 17:32
个人简介

大家好 请多多关照

文章分类

全部博文(19)

文章存档

2011年(5)

2009年(14)

我的朋友

分类: 项目管理

2011-09-23 15:50:46

UML类图中的几种关系

UML类图中的“关联关系(association)”、“聚合关系(aggregation)"、”合成关系(composition"和“依赖关系(depedency)。

(1)关联关系 (association)

   (1)关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
   (2)关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
(2) 聚合关系 (aggregation)
   1、聚合关系是关联关系的一种,是强的关联关系。
   2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
   3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系       中,两个类处于不同的层次上,一个代表整体,一个代表部分。
   4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
(3)合成关系 (composition):
   1、合成关系是关联关系的一种,是比聚合关系还要强的关系。
   2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
(4)依赖关系 (dependency):
   1、依赖关系也是类与类之间的联结
   2、依赖总是单向的。
   3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。

=================================================================================

UML类图中的几个关系:关联、组合、聚合、依赖关系比较

类之间的关系种类: Generalization(泛化)Dependency(依赖关系)Association(关联关系)Aggregation(聚合关系)、Composition(合成关系)
其中Aggregation(聚合关系)Composition(合成关系)属于Association(关联关系),是特殊的Association 关联关系。
 
Generalization(泛化)表现为继承或实现关系(is a) 。具体形式为类与类之间的继承 关系,接口与接口之间的继承关系,类对接口的实现关系。
Association关联 系表现为变量(has a )。类与类之间的联接,它使一个类知道另一个类的属性和方法。例如如果A依赖于B,则B体现为A的全局变量。关联关系有双向关联和单向关联。双向关联:两个类都知道另一个类的公共属性和操作。单向 关联:只有一个类知道另外一个类的公共属性和操作。大多数关联应该是单向的,单向关系更容易建立和维护,有助于寻找可服用的类。
Aggregat ion(聚合关系) 是关联关系的一种,是强的关联关系。聚合关系是整体和个体的关系。普通关联关系的两个类处于同一层 次上,而聚合关系的两个类处于不同的层次,一个是整体,一个是部分。同时,是一种弱的“拥有”关系。体现的是A对象可以包含B对象,但B对象不是A对象的组成部分。具体表现为,如果AB聚合成,表现为A包含有B的全局对象,但是B对象可以不在A创建的时刻创建。
Composition(组合关系)是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象 的生命周期。Composition(组合关系)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一致。如果AB组成,表现为A包含有B的全局对象,并且B对象在A创建的时刻创建。
 Dependency(依赖关系)表现为函数中的参数(use a)。是类与类之间的连接,表示一 个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。例如如果A依赖于B,则B体现为局部变量,方法的参数、或静态方法的调用。常见的依赖关系如下:
   (1)类B以参数的形式传入类A的方法。
   (2)类B以局部变量的形式存在于类A的方法中。
   (3)类A调用类B的静态方法。

====================================================================================
 
区分 UML 类图中的几种关系
UML 类图中的 ”关联关系(association) “、”聚合关系(aggregation) “、”合成关系 (compostion)“ 和”依赖关系 (dependency)“ 不是很容易区分清楚,《UML distilled》 对这几个关系也没有解释的特别清楚。
 
1) 关联关系 (association)
 
a. 关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
b. 关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
c.  在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
 
  1. class 徒弟
  2. {
  3. };

  4. class 唐僧
  5. {
  6.  protected:
  7.    list<徒弟> tdlist;
  8. };
 
 
   
2)聚合关系 (aggregation)
 
a.聚合关系是关联关系的一种,是强的关联关系。
b.聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
c.聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
d.关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。
 
  1. class 引擎
  2. {
  3. };
  4. class 轮胎
  5. {
  6. };
  7. class 汽车
  8. {
  9. protected:
  10.     引擎 engine;
  11.     轮胎 tyre[4];
  12. };
  
   

3)合成关系 (composition):

a. 合成关系是关联关系的一种,是比聚合关系还要强的关系。
b. 它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

  1. class
  2. {
  3. };
  4. class
  5. {
  6. protected:
  7.     肢 limb[4];
  8. };

4) 依赖关系 (dependency):
 
a.依赖关系也是类与类之间的联结
b.依赖总是单向的。
c.依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
  1. public class Person
  2. {
  3.    public void buy( Car car )
  4.    {

  5.    }
  6. }

总结:

 1、不同的关系采用不同的 UML 图例
 2、对于聚合关系、合成关系,由于都是关联关系的一种,因此在不确定的情况下,可以以关联关系来描述它们。

=================================================================================
   
    在1997年, 对象管理组织(Object Management Group) 发布了统一建模语言UML(Unified Modeling Language). UML的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用. UML提出了一套IT专业人员期待多年的统一的标准建模符号. 通过使用UML, 这些人员能够阅读和交流系统架构和设计规划--就像建筑工人多年来所使用的建筑设计图一样.  到2003年以后, UML已经获得了业界的认同. 下面主要对UML类图的几种关系模式简要说明:

      在UML类图中的关系模式主要有以下几种: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 依赖(Dependency) 等.

1. 泛化(Generalization)
      泛化关系: 是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为. 老虎是动物的一种, 即有老虎的特性也有动物的共性.  见下图:



用代码表示如下:
    // Animal.h   
  1. class CAnimal   
  2. {   
  3. public:   
  4.     // implement   
  5.     virtual HRESULT EatSomething()   
  6.     {   
  7.         // Do something   
  8.     }   
  9. };   
  10.   
  11. // Tiger.h   
  12. #include "Animal.h"   
  13. class CTiger : public CAnimal   
  14. {   
  15.     // Do something   
  16. };  


2. 实现(Realization)
实现关系: 是一种类与接口的关系, 表示类是接口所有特征和行为的实现. 见下图:



用代码表示如下:

   // Animal.h   
  1. class CAnimal   
  2. {   
  3. public:   
  4.     // interface   
  5.     virtual HRESULT EatSomething() = 0;   
  6. };   
  7.   
  8. // Tiger.h   
  9. #include "Animal.h"   
  10. class CTiger : public CAnimal   
  11. {   
  12.     // Do something   
  13. };  


注: 泛化和实现的区别就在于子类是否继承了父类的实现, 如有继承则关系为泛化, 反之为实现.

3. 关联(Association)
关联关系: 是一种拥有的关系, 可以分为双向关联, 单向关联和自身关联.
双向关联是指双方都拥有对方的引用, 都可以调用对方的公共属性和方法. 见下图:



用代码表示如下:
   // Husband.h   
  1. #include "wife.h"   
  2. class CHusband   
  3. {   
  4. public:   
  5.     CWife* pWife;   
  6. };   
  7.   
  8. // Wife.h   
  9. #include "Husband.h"   
  10. class CWife   
  11. {   
  12. public:   
  13.     CHusband* pHuband;   
  14. };  


上图中丈夫和妻子是比较公平的关系, 都可以使用对方公共的属性.

单向关联是指只有某一方拥有另一方的引用, 这样只有拥有对方者可以调用对方的公共属性和方法. 如下图:



用代码表示如下:
    // Husband.h   
  1. class CHusband   
  2. {   
  3. public:   
  4.     int nMoney;   
  5.     void GoShopping();    
  6. };   
  7.   
  8. // Wife.h   
  9. #include "Husband.h"   
  10. class CWife   
  11. {   
  12. public:   
  13.     CHusband* pHuband;   
  14. };  


上图中妻子拥有丈夫, 可以使用对方的属性, 比如钱, 可以让对方做能做的事, 比如去买东西.

自身关联是指拥有一个自身的引用. 如下图



用代码表示如下:
  1. // SingleMan.h   
  2. class CSingleMan   
  3. {   
  4. public:   
  5.     CSingleMan *pSingleMan;   
  6. };  


4. 聚合(Aggregation)和组合(Composition)
聚合关系: 是整体与部分的关系, 且部分可以离开整体而单独存在. 如车和轮胎是整体和部分的关系, 轮胎离开车仍然可以存在.
组合关系: 是整体与部分的关系, 但部分不能离开整体而单独存在. 如公司和部门是整体和部分的关系, 没有公司就不存在部门.



用代码表示如下:
  1. // Car.h   
  2. #include "Tyre.h"   
  3. class CCar   
  4. {   
  5. public:   
  6.     CTyre cTyre;   
  7. };   
  8.   
  9. // Tyre.h   
  10. #include "Car.h"   
  11. class CTyre   
  12. {   
  13.     // Do something   
  14. };  

    // Company.h   
  1. #include "Department.h"   
  2. class CCompany   
  3. {   
  4. public:   
  5.     CDepartment cDepartment;   
  6. };   
  7.   
  8. // Department.h   
  9. #include "Company.h"   
  10. class CDepartment   
  11. {   
  12.     // Do something   
  13. };  


5. 依赖(Dependency)
依赖关系: 是一种使用的关系,  即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖. 如下图:



用代码表示如下:

    // Car.h   
  1. class CCar   
  2. {   
  3.     // Do something   
  4. };   
  5.   
  6. // Person.h   
  7. #include "Car.h"   
  8. class CPerson   
  9. {   
  10.     void MoveFast(CCar &pCar);   
  11. };  

上图中人的快速移动需要有车的协助, 但是这种依赖是比较弱的, 就是人也可以不用车而用其他工具, 与关联不同的是人不必拥有这辆车只要使用就行.
http://www.csinx.org/iblog/article.asp?id=18

阅读(3887) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~