关联,依赖,泛化(又称继承分为扩展或包含),实现,聚合(共享),复合(组合)
从关联—依赖—泛化—实现—聚合—复合是一层比一层对两个类之间的关系描述紧密。
1.关联
一般是指两个类之间有相对松散关系,若双方都知道对方则可用实线[双向箭头]连接,或只其中一方知道则用实线加单向箭头从隐藏方指向暴露方,但某个类是否存在并不影响另一个类的存在与否.
如客户与车子(通过买,租用或其它方式联系在一起);
2.依赖(Dependency)
实体之间一个“使用”关系暗示一个实体的发生变化后,可能影响依赖于它的其他实例。 更具体地说,它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个局部变量,对通过方法调用而获得的一个对象的引用(如下例所 示),或者对一个类的静态方法的引用(同时不存在那个类的一个实例)。也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的 各个类之间的关系,表示出包和包的关系
这里B与A的关系只是一种依赖(Dependency)关系,这种关系表明,如果类A被修改,那么类B会受到影响。
图表 5依赖
3.泛化(Generalization)
表示一个更泛化的元素和一个更具体的元素之间的关系,现实世界中一般与特殊关系就是最好的表现。
图表 1泛化
在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person(人)是基类,Teacher(教师)、Student(学生)、Guest(来宾)是子类。
若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。
例如,教师是人,Teacher 是Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。
如果A是基类,B是A的派生类,那么B将继承A的数据和函数。
如果类A和类B毫不相关,不可以为了使B的功能更多些而让B继承A的功能和属性。
若在逻辑上B是A的“一种”(a kind of ),则允许B继承A的功能和属性。
4.实现(Realization)
指定两个实体之间的一个合约。换言之,一个实体定义一个合约,而另一个实体保证履行该合约。
5.聚合(aggregation)
代表两个类之间的整体/局部关系,是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。
图表 3共享
上面图中,有一个菱形(空心)表示聚合(aggregation)(聚合类型为共享),聚合的意义表示has-a关系。
6.组合(composition)
代表两个类之间的整体/局部关系但是一种绝对构成的关系,局部不能为其它整体所共享,暗示“局部”在“整体”内部的生存期职责。合成也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。
例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生(继承)而成。
图表 4复合
这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)(聚合类型为复合)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制。即A会随着B的创建而创建,随B的消亡而消亡。