转:
http://kb.cnblogs.com/page/129490/
http://www.vckbase.com/index.php/wv/232
http://www.cppblog.com/API/archive/2011/03/31/143085.html
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
1. 泛化(Generalization)
【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【箭头指向】:带三角箭头的实线,箭头指向父类
2. 实现(Realization)
【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.
【箭头指向】:带三角箭头的虚线,箭头指向接口
3. 关联(Association)
【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
下图为自身关联:

4. 聚合(Aggregation)
【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
5. 组合(Composition)
【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
【代码体现】:成员变量
【箭头及指向】:带实心菱形的实线,菱形指向整体

6. 依赖(Dependency)
【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这张UML图,比较形象地展示了各种类图关系:

以下含有对各种关系的c++语言的实现
UML 类图中的 ”关联关系(association) “、”聚合关系(aggregation) “、”合成关系 (compostion)“ 和”依赖关系 (dependency)“ 不是很容易区分清楚,《UML distilled》 对这几个关系也没有解释的特别清楚。近日翻阅《Java 与模式》,发现其中对这些关系有较为清晰的描述,特摘录如下:
关联关系 (association):
(1)关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。 (2)关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
(3)在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。
class 徒弟
{ }; class 唐僧 { protected: list<徒弟> tdlist; }; 
聚合关系 (aggregation):
1、聚合关系是关联关系的一种,是强的关联关系。 2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。 3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。 4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。 class 引擎 { }; class 轮胎 { }; class 汽车 { protected: 引擎 engine; 轮胎 tyre[4]; }; 
合成关系 (composition):
1、合成关系是关联关系的一种,是比聚合关系还要强的关系。 2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。 class 肢 { }; class 人 { protected: 肢 limb[4]; };

依赖关系 (dependency):
1、依赖关系也是类与类之间的联结 2、依赖总是单向的。 3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。
显示代码打印
{ public void buy(Car car) { ... } }
类图
静态视图说明了对象的结构,其中最常用的就是类图,类图可以帮助我们更直观的了解一个系统的体系结构,有时侯,描述系统快照的对象图(Object diagram)也是很有用的。在这里,我们主要介绍类图,下面的图就是一个简单的类图:

在类图中,类由矩形框来表示,如上图中,定义了4个类,分别为Base、A、B、C,类之间的关系通过各种线条和其他符号来表示,在上图中,空心的三角表示继承关系,在UML的术语中,这种关系被称为泛化(Generalization),所以上面的类用等价代码表示为:
1.
class Base{…};
2.
class A: public Base{…};
3.
class B: public Base{…};
4.
class C: public Base{…};
我们再看下一幅图:
这幅图与上幅几乎没有什么区别,唯一的不同就是Base类中增加了成员,一个私有的integer _x(UML术语为property)和一个公有的fun()的函数(method),是否需要这些类的内部细节UML本身并没有限制,完全取决于你自己如何使用,UML的用处在于帮助你了解系统,所以只要你自己觉得足够清楚,那么够了,不要再复杂了。
接着看第三幅图:
上面图中的箭头表示一种关系,箭头另一边有一个菱形(空心)表示聚合(aggregation),聚合的意义表示has-a关系,其等价代码如下:
1.
class A{…};
2.
class B{ A* theA;…};
聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。
下面的图:

这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系――组合(composition)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制,通常情况,等价代码如下:
1.
class A{…};
2.
class B{A theA;…};
即A会随着B的创建而创建,随B的消亡而消亡。
下图:

这里B与A的关系只是一种依赖关系,这种关系表明,如果类A被修改,那么类B会受到影响,一个简单的例子就是:
1.
class A{…};
2.
class B{fun(A params);…};
常用的关系就是我们上面用的这些,通过这些关系和类表示的类图,我们可以用图形化的方式描述一个系统的设计部分,当你习惯使用UML后,你会发现,这往往比你告诉同伴某某类从某某类派生,派生类又和某某类具有什么关系容易的多。
|