在Class类中,一般都封装了属性和行为方法,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称
。在系统中,每个类都具有一定的功能职责1,一个类可以有多种职责,设计得好的类一般只有一种职责,即符合单一职责原则。
在定义类的时候,将类的职责分解成为类的属性和行为操作(即方法)。类的属性即类的数据职责,类的操作即类的行为职责。设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。
在软件系统运行时,类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)。
类图(Class Diagram
)使用出现在系统中的不同类来描述系统的静态结构,它用来描述不同的类以及它们之间的关系。
在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class)
、控制类(Control Class)
和边界类(Boundary Class)
,下面对这三种类加以简要说明:
(1) 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,一般使用数据库表或文件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。实体类来源于需求说明中的名词,如学生、商品等。
(2) 控制类:控制类用于体现应用程序的执行逻辑,提供相应的业务操作,将控制类抽象出来可以降低界面和数据库之间的耦合度。控制类一般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有一个商品增加类,注册对应有一个用户注册类等
(3) 边界类:边界类用于对外部用户与系统之间的交互对象进行抽象,主要包括界面类,如对话框、窗口、菜单等。
在面向对象分析和设计的初级阶段,通常首先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。
在UML类图中,类使用包含类名、属性和操作且带有分隔线的长方形来表示。
在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式,下面将逐步详细介绍。参考链接
在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个User类,它包含createTime,userName、userPhone和sex这4个属性,以及getUserInfo(Long id)和getAllUserInfo()方法。
那么属性或者方法名称前加的加号和减号是什么意思呢?它们表示了这个属性或方法的可见性,UML类图中表示可见性的符号有三种:
+
:表示public-
:表示private#
:表示protected(friendly也归入这类)因此,上图中的User类具有3个私有属性,一个公开属性和两个公有方法。当然啦,不同的建模工具,可能有细微的差别,比如Rational Rose建模工具里,可见性不是用加好和减号表示的,用图标表示的。
实际上,类的属性的完整表示方式是这样的:
可见性 名称 :类型 [ = 缺省值]
中括号中的内容表示是可选的。
方法的完整表示方式如下:
可见性 名称(参数列表) [ : 返回类型]
同样,中括号中的内容是可选的。
比如在下图的Dept类中,定义了3个方法:
这三个方法的可见性详解:
类和类之间的6种关系:
泛化(Generalization)
,实现(Realization)
,关联(Association)
,聚合(Aggregation)
,组合(Composition)
,依赖(Dependency)
。
各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖。
类之间6种关系汇总:
关系 | 关系如何使用UML图表达 |
---|---|
泛化 | 使用带空心三角形的实线表示泛化(继承)关系 |
实现 | 使用带空心三角形的虚线表示实现关系 |
关联 | 单向关联使用一个带箭头的实线表示,双向关联使用一个不带箭头的实线表示,自关联使用一个带有箭头且指向自身的实线表示 |
聚合 | 聚合关系用带空心菱形和箭头的实线表示 |
组合 | 组合关系用一个带实心菱形和箭头的实线表示 |
依赖 | 依赖关系用一条带有箭头的虚线表示 |
下面使用类图,详细介绍每一种关系。
泛化关系,指的就是:类和类、接口与接口之间的继承
关系。继承关系可以用IS-A
表示。
举例:
人是一种高级动物,就可以表示为:Person是一个(IS-A
)高级动物,这就是一种继承关系。
继承使用的是extends
关键字,在UML类图中,使用带空心三角形的实线表示泛化(继承)关系
,如下图所示中,Person类与Cat类都继承了Animal类。Person和Cat都会继承到Animal的公有方法eat()方法。
接口是一种特殊的抽象类,实现关系(like a
)使用的是implements
关键字,在UML类图中,使用带空心三角形的虚线表示实现关系
。如下图中,定义了一个抽象动物接口,里面有个公开的eat()方法。使用Dog类实现了Animal接口的eat()方法。
关联关系指的是,一个类与另一个类之间有某种关联。这种关联关系可以使用HAS-A
表示。
关联关系如果进行详细的划分,又可进一步分为单向关联
、双向关联
和自关联
。
单向关联
双向关联
从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。在UML类图中,双向关联使用一个不带箭头的实线表示
。上图中在Dept类中维护一个User类型的成员变量,在User类中,也维护了一个Dept类型的成员变量,这种就属于双向关联。
自关联
自关联在UML类图中,自关联使用一个带有箭头且指向自身的实线表示
。
上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。
聚合关系描述的是整体和部分的关系,是一种比较特殊的关联关系
。在聚合关系中,整体的生命周期,不会决定部分的生命周期。
比如:
汽车和发动机引擎之间的关系、老师和学生之间的关系,就是整体和部分的关系。
上图中的Car类与Engine类就是聚合关系(Car类中包含一个Engine类型的成员变量)。由上图我们可以看到,在UML类图中,聚合关系用带空心菱形和箭头的实线表示
。聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。比如上图中汽车包含了发动机引擎,汽车脱离了发动机是可以单独存在的,而发动机引擎脱离了汽车也能单独存在。
组合关系也可以看作是一种特殊的聚合关系
,是一种比聚合关系还要强的关系。整体的生命周期决定部分的生命周期,部分是依附在整体上面的,有时候也有人称为合成关系
。
组合关系与聚合关系最大的不同在于:组合关系这里的“部分”脱离了“整体”是无法存活的,部分就不复存在。比如下图人体和细胞的关系:
细胞组成人的一部分,显然,细胞脱离了人,是不能单独存在的。在UML类图中,组合关系用一个带实心菱形和箭头的实线表示
。
依赖关系是比关联关系弱的一种关系,是所有关系中最弱的一种,在java语言中体现为返回值,参数,局部变量和静态方法调用。
从上图我们可以看到,汽车驾驶员CarDriver的drive方法只有传入了一个Car对象才能发挥作用,因此我们说CarDriver类依赖于Car类。在UML类图中,依赖关系用一条带有箭头的虚线表示
。
好啦,UML类之间的6种关系介绍完了,如果这篇文章对你有帮助,欢迎给个赞,您的支持,是博主创作最大的动力!
写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!
如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!
给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!
职责指的是一个类要完成什么样的功能,要承担什么样的义务。 ↩︎