UML六大关系:
泛化关系,实现关系,依赖关系,关联关系,聚合关系,组合关系。
Note: 泛化关系和实现关系表现为继承或实现(is a);
依赖关系表现为函数中的参数(use a);
关联关系、聚合关系、组合关系表现为成员变量(has a)。
1. 泛化关系(generalization )
泛化关系指的是一个更泛化的元素和一个更具体的元素之间的关系,也就是通常所说的类的继承关系。
用空心箭头 + 实线表示,箭头指向父类。
举例:class Lion 和 class WhiteLion
class Lion
{
public:
virtual void roar()
{
cout<<"狮子吼叫!"<<endl;
}
}
class WhiteLion:public Lion{
public:
virtual void roar()
{
cout<<"白狮子吼叫!"<<endl;
}
}
2. 实现关系(realization )
表现为:类实现接口,即一个类实现某个接口。
用单向,空心箭头 + 虚线;箭头指向接口。
举例:唐老鸭(类)会说话(接口, 在c++里可以被看做abstract class), 唐老鸭类实现了ISpeak接口。
class Duck
{
};
class ISpeak
{
public:
virtual speak() = 0
};
class DonaldDuck: public Duck, public ISpeak
{
public:
virtual speak()
{
cout<<"Donald Duck speaks!"<<endl;
}
};
3. 依赖关系(dependency)
表现为:一个元素以某种方式依赖于另一个元素,描述了类与类之间的一种使用与被使用的关系,是短暂的关系。用单向虚线加箭头来表示,箭头指向被依赖的类。
举例:class Person中使用了class Boat的对象,则Person依赖Boat。
class Boat
{
public:
void oarage()
{
cout<<"oarage()"<<endl;
}
}
class Person
{
//划船
public :
void oarage(Boat boat)
{
boat.oarage();
}
}
4. 关联关系(association)
关联关系是一种静态结构上的关系,换言之,它偏向于数据关系。所以,两类别之间放置关联关系,同时意味着这个关系必须被保存起来,这也是为何UML类 别图中最常出
现的是关联关系。比方说,顾客跟订单之间的关系,就会使用关联关系,因为我们希望系统可以保存两者之间的关系。
关联关系的两个类处于同一个层次上,即两个类不存在整体与部分的关系。
关联关系可以是双向的,也可以是单向的。
变现为: 双向的关联可以有两个箭头或者没有箭头,单向的关联只有一个箭头。
5. 聚合关系(aggregation)
是关联关系的一种,是一种强关联关系;
聚合关系是整体和个体/部分之间的关系,存在聚合关系的两个类处于不同的层次上,一个是整体,一个是个体/部分。
Note: 多个整体可以共享同一个个体。譬如:boost::shared_ptr中的sp_count_base对象被多个shared_count类共享。
表现为: class B的对象不是在class A中创建的,class A 的销毁不一定会导致class B的销毁。他们具有各自的生命周期。
最典型的例子是,class A 中有一个关于class B的对象的指针或者引用,但是该指针或引用指向的真正对象不是在class A中创建的。
用单向,空心菱形 + 实线 + 箭头来表示,箭头指向被聚合的类,也就是说,箭头指向个体/部分;空心菱形指向聚合的类的对象。
6. 组合关系(composition)
也是关联关系的一种,但它是比聚合关系更强的关系。
组合关系要求聚合关系中代表整体的对象要负责代表个体/部分的对象的整个生命周期;在组合关系中,如果代表整体的对象被销毁或破坏,那么代表个体/部分的对象也一定会被销毁或破坏,他们有着相同的生命周期。
Note: 多个整体不可以同时间共享同一个个体。
表体现:class B 的对象是在class A中创建的,随着class A的销毁,class B也被销毁。他们具有共同的生命周期。
最典型的例子是,class A中有一个成员变量是class B类型的对象。
用单向,实心菱形 + 实线 + 箭头表示,箭头指向代表个体/部分的对象,也就是被组合的类的对象;实心菱形指向组合的类的对象。