-
泛化:(Generalization):
- 表示继承关系, 表示类/接口对父类/接口的功能扩展.
- java语法中的
extends
, 用来扩展父类或父接口的功能. -
图形表示: 带三角箭头的实线, 箭头指向父类或父接口.
泛化关系.png - 代码表示
class Child extends Parent {}
-
实现(Realization):
- 表示类实现接口定义的行为或功能.
- java语法中的
implements
. -
图形表示:带三角箭头的虚线, 箭头指向接口.
实现关系.png - 代码表示
class Plane implements Flyable{ public void fly() {} }
-
依赖(Dependency):
-
表示使用关系, A需要B的协助来完成工作形成的关系, 但是这种使用关系具有临时性的特点. 比如, 厨师在烹饪的时候看了一眼菜谱, 厨师"使用"了菜谱, 照着它炒完菜后,这种使用关系就结束了(临时性).
-
java的语法中, 被依赖的对象/类, 以方法参数, 局部变量和静态方法调用的形式出现.
-
图形表示: 因为依赖和被依赖关系比较弱, 所以使用虚线+箭头表示. 箭头指向被依赖者.而且一般是单向关系.
依赖关系.png -
代码表示
class Chef { public void check(Recipe r) { r.showProcedure(); } }
-
-
关联(Association):
-
关联关系,表示"拥有", 相比依赖关系的临时性和单向性, 关联关系具有长期性, 平等性(可双向),所以关联表示的关系比依赖更强. 比如现实生活中的夫妻, 师生等关系. 长期存在并且是相互的关系. 此外关联可以表示一对一,一对多, 多对一, 多对多等各种关系.
-
java语法中, 被拥有者作为拥有者的成员变量存在.
-
图形表示: 因为比依赖关系更强, 所以是实线+箭头.双向关联可以省略箭头
关联关系.PNG -
代码表示:
class Husband { private Wife wife; private Address address; } class Wife { private Husband husband; }
-
后面两种关系 "聚合
" 和 "组合
", 都属于关联关系, 用来表示关联关系中整体与部分
的关系, 虽然各有特点, 但既然都属于关联关系, 它们在语法上是没有区别的, 都是用成员变量
表达.
-
聚合(Aggregation):
- 表示"has-a"关系, 整体与部分的关系, 这种关系相对于
组合
弱一些, 整体与部分是可分离的. 比如, 部门与员工, 部门有许多员工, 员工离职了, 部门仍然存在,并不会受到影响, 部门解散了,员工可以去其他部门(整体与部分可分离) -
图形表示: 空心菱形+实线+箭头, 箭头指向部分, 菱形指向整体.
聚合关系.png
- 表示"has-a"关系, 整体与部分的关系, 这种关系相对于
-
组合(Composition):
-
表示"contains-a"的关系. 是一种组装的关系. 并且整体与部分是不可分离的. 比起
聚合
限制更强了. 这种关系中,整体与部分的生命周期是一致的, 这个限制是非常这严苛的, 以至于在现实中很难找到符合的示例.
但是在程序中,反而很好实现, 因为我们可以完全掌控对象的生命周期. 所以这种关系并不是对现实世界中某类关系的抽象, 而是具体的, 战术性的逻辑工具, 设计者使用它来表达类之间的这种强限制.
例如, 在现实中, 人体和器官(整体和部分)的生命周期并不一致. 但设计的系统中并不支持器官移植之类的功能, 所以器官单独出现在系统中就没有意义, 使用组合可以明确表达这种目的.
这也是组合唯一的目的,表示给整体与部分的关系加一层限制,而不是直接对问题域中的关系建模. 操作上可以先识别聚合(整体与部分)关系. 然后判断如果部分在整体的概念之外没有存在的意义, 就可以确定为组合.
而在具体实现上, 可以将部分完全作为整体的内部状态, 比如私有的内部类. 这种强限制关系使用比较少. -
图形表示: 实心菱形+ 实线+ 箭头, 菱形指向整体, 箭头指向部分
组合关系.png
-
总结
继承 | 实现 | 依赖 | 关联 | 聚合 | 组合 | |
---|---|---|---|---|---|---|
关系含义 | 功能扩展 | 功能实现 | 使用 | 拥有 | 整体-部分(has-a) | 整体-部分(contains-a) |
关系特性 | - | - | 临时性,单向性 | 长期性,可双向(平等性) | 整体与部分可分离 | 整体与部分不可分离,生命周期一致 |
java语法 | extends | implements | 方法参数,局部变量,静态方法调用 | 成员变量 | 成员变量 | 成员变量 |
关系强弱 | 强 | 强 | 弱 | 较强 | 较强 | 非常强 |
现实事例 | 父子 | 飞机/鸟可以飞 | 厨师使用菜谱,裁判使用秒表 | 夫妻,师生 | 部门-员工 | - |
图形表示 | ||||||
图形指向 | 箭头指向父类 | 箭头指向接口 | 箭头指向被使用者 | 指向被拥有者,可双向 | 箭头指向部分, 菱形指向整体 | 箭头指向部分,菱形指向整体 |
网友评论