在绘制类图时,明确类与类之间的关系是关键。这些关系包括泛化(Generalization)、实现(Realization)、依赖(Dependency)和关联(Association)。其中,关联又可以分为一般关联关系和聚合关系(Aggregation)、合成关系(Composition)。接下来,我们通过实例来理解这些关系。
基本概念:
类图(Class Diagram):类图是面向对象系统建模中最常用且最重要的图表,它是定义其他图表的基础。类图主要用于显示系统中的类、接口以及它们之间的静态结构和关系的静态模型。类图有三个基本组件:类名、属性和方法。
泛化(generalization):表示is-a的关系,这是对象之间耦合度最大的关系,子类继承父类的所有细节。在类图中,使用带三角箭头的实线表示,箭头从子类指向父类。
实现(Realization):在类图中表示接口和实现的关系。这个概念无需过多解释。在类图中,使用带三角箭头的虚线表示,箭头从实现类指向接口。
依赖(Dependency):这是对象之间最弱的一种关联方式,是临时性的关联。在代码中,通常指由局部变量、函数参数、返回值建立的对其他对象的调用关系。一个类通过调用被依赖类中的某些方法来完成其职责。在类图中,使用带箭头的虚线表示,箭头从使用类指向被依赖的类。
关联(Association):表示对象之间的引用关系,如客户类与订单类之间的关系。这种关系通常通过类的属性表达。关联还可以分为一般关联、聚合关联与组合关联。后两种关系将在后面进行分析。在类图中,使用带箭头的实线表示,箭头从使用类指向被关联的类,可以是单向和双向。
聚合(Aggregation):表示has-a的关系,是一种不稳定的包含关系。它比一般关联更强,具有整体与局部的关系,并且在没有整体的情况下,局部也可以单独存在。例如,公司和员工之间的关系:公司包含员工,但如果公司倒闭,员工仍然可以换公司。在类图中,使用空心菱形表示,菱形从局部指向整体。
组合(Composition):表示contains-a的关系,这是一种强烈的包含关系。组合类负责被组合类的生命周期。这是一种更强大的聚合关系。部分不能脱离整体而存在。例如,公司和部门之间的关系:没有公司,部门也不能存在;调查问卷中问题和选项之间的关系;订单和订单选项之间的关系。在类图中,使用实心菱形表示,菱形从局部指向整体。
多重性(Multiplicity):
多重性通常用于关联、聚合和组合关系中,表示存在多少个关联对象。使用数字或星号(*)表示。例如,一个割接通知可以关联0个到N个故障单。
聚合和组合的区别:
聚合关系和组合关系在理解上较难。关键区别在于:聚合关系表示“has-a”关系,而组合关系表示“contains-a”关系;聚合关系中的部分事物对象与整体之间的联系较弱,而组合关系中的联系较强;聚合关系中,代表部分事物的对象的生存期与代表聚合事物的对象无关,一旦删除了聚合对象,不一定就删除了代表部分事物的对象;而在组合关系中,一旦删除了组合对象,同时也就删除了代表部分事物的对象。
实例分析:
联通客户响应OSS时,系统包含故障单、业务开通、资源核查、割接、业务重保、网络品质性能等功能模块。以下举例说明这些概念:
1. 通知分为一般通知、割接通知和重保通知,这是一种继承关系。
2. NoticeService和实现类NoticeServiceImpl是实现关系。
3. NoticeServiceImpl通过save方法的参数引用Notice,形成依赖关系。同时调用BaseDao完成功能,也是依赖关系。
4. 割接通知和故障单之间通过中间类(通知电路)关联,这是一般关联关系。
5. 重保通知和预案库间是聚合关系,因为预案库可以事先录入,与重保通知没有必然联系,可以独立存在。在系统中需手工从列表中选择。删除重保通知不影响预案。
6. 割接通知和需求单之间是聚合关系。需求单可以独立于割接通知存在。也就是说删除割接通知不影响需求单。
7. 通知和回复是组合关系。因为回复不能独立于通知存在。也就是说删除通知时,该条通知对应的回复也需要级联删除。
通过以上分析,相信大家已经对类之间的关系有了较好的理解。如果您有其他想法或建议,请随时提出。目前已有5000+人关注并加入我们。