在画类图的时候,理清类和类之间的关系是重点;
类的关系有泛化(Generalization)
、实现(Realization)
、依赖(Dependency)
、关联(Association)
;
关联又分为一般关联关系
、聚合关系(Aggregation)
、合成关系(Composition)
。
基本概念
类
类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作(方法)、关系的对象集合的总称;
在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务;
一个类可以有多种职责,设计得好的类一般只有一种职责;
在定义类的时候,将类的职责分解成为类的属性和操作(方法);
类的属性即类的数据职责,类的操作即类的行为职责;
设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。
类将被实例化成
对象(Object)
,对象对应于某个具体的事物,是类的实例(Instance)
。
类图(Class Diagram)
类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础;
类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。
在UML类图中,类一般由三部分组成::类名、属性、方法
类的UML图示
1、第一部分是类名
:每个类都必须有一个名字,类名是一个字符串。
2、第二部分是类的属性(Attributes)
:属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。
UML规定属性的表示方式为:
可见性 名称:类型 [ = 缺省值 ]
其中:
“可见性”
表示该属性对于类外的元素而言是否可见,包括公有(public
)、私有(private
)和受保护(protected
)三种,在类图中分别用符号+
、-
和#
表示。“名称”
表示属性名,用一个字符串表示。“类型”
表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。“缺省值”
是一个可选项,即属性的初始值。
3、第三部分是类的操作(Operations)
:操作是类的任意一个实例对象都可以使用的行为,是类的成员方法。
UML规定操作的表示方式为:
可见性 名称(参数列表) [ : 返回类型]
其中:
“可见性”
的定义与属性的可见性定义相同。“名称”
即方法名,用一个字符串表示。“参数列表”
表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号“,”隔开。“返回类型”
是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void)
,如果是构造方法,则无返回类型。
类与类之间的关系
泛化(generalization)
表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。在类图中使用带三角箭头的实线表示,箭头从子类指向父类。
泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。
图例:
实现(Realization)
在类图中就是接口和实现的关系。
类图中使用带三角箭头的虚线表示,箭头从实现类指向接口。
图例:
依赖(Dependency):对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类。
关联(Association)
对象之间一种引用关系,比如客户类与订单类之间的关系。
这种关系通常使用类的属性表达。
关联又分为一般关联、聚合关联与组合关联。
后两种在后面分析。在类图使用带箭头的实线表示,箭头从使用类指向被关联的类。可以是单向和双向。
如:汽车和轮胎、师傅和徒弟、班级和学生等等
图例:
聚合(Aggregation)
表示has-a的关系,是一种不稳定的包含关系。
较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。
在类图使用空心的菱形表示,菱形从局部指向整体。
如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。
例如:汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此,汽车和发动机是聚合关系
图例:
组合(Composition)
表示contains-a的关系,是一种强烈的包含关系。
组合类负责被组合类的生命周期。是一种更强的聚合关系。部分不能脱离整体存在。
在类图使用实心的菱形表示,菱形从局部指向整体。
例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系
图例:
多重性(Multiplicity)
通常在关联、聚合、组合中使用。就是代表有多少个关联对象存在。使用数字..星号(数字)表示。
多重性表示方式列表
聚合和组合的区别
这两个比较难理解,聚合和组合的区别在于:
- 聚合关系是“has-a”关系,组合关系是“contains-a”关系;
- 聚合关系表示整体与部分的关系比较弱,而组合比较强;
- 聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。
- 组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
实例图例 :
关于手机的类图