2.2 关于UML建模语言
在上一节中,我们简单介绍了设计模式的初步概念。设计模式所注重的并非是具体代码的编写,而是代码的组织结构。并且,设计模式也是为了方便工程师之间进行设计思路的交流。如何描述所设计的系统是非常重要的。UML Unified Modeling Language,统一建模语言就是用来描述系统设计的一种语言。
2.2.1 UML简介
1997年UML语言被采纳为面向对象建模语言的国际标准。UML通过简单统一的图像化结构来表达软件设计中的类与对象的布局和关系,使得设计人员的沟通更加简化,进一步缩短了设计时间,减少了开发成本。
UML模型从不同角度出发定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图和部署图。UML不仅仅只能用于软件设计领域,在其他工程设计领域也有非常广泛的应用。
本节将着重介绍使用UML描述构建类图的相关内容。在软件设计中,类图也是最常用的描述系统设计的方式。
在软件设计中,类可以通过3个要素来进行描述,分别为类名、属性和行为。属性是类中定义的成员变量,行为是类中定义的成员方法。在UML中,描述类中的一个属性的语句如下:
[可见性]属性名:类型
示例如下:
-name:String
上面的UML语句描述了一个名为name的私有属性,为String字符串类型。其中,“-”描述属性的可见性为私有,在UML中可以表达可见性的符号如表2-1所示。
表2-1 在UML中可以表达可见性的符号
类中的方法可以使用如下格式描述:
[可见性]名称(参数列表)[:返回类型]
示例如下:
+hello():void
上面定义了一个公开的方法,命名为hello,其中没有参数且返回值为空。
在UML类图中定义一个教师类,如图2-1所示。
图2-1 使用UML描述教师类
在UML类图中,定义接口的方式与定义类的方式基本一致。接口是一种结构,不可以被实例化,其中可以定义方法但是不对方法进行实现,通常会包含抽象的行为。如图2-2所示定义了一个名为People的接口。
图2-2 使用UML描述接口
2.2.2 使用UML描述类之间的关系
在软件设计中,类并不是互相孤立的,类与类之间存在着各种关系。根据类与类的耦合程度,从低到高可以分为如下几种关系:
- 依赖关系
- 关联关系
- 聚合关系
- 组合关系
- 泛化关系
- 实现关系
其中依赖关系的耦合性最弱,表示临时性的一种关联。例如,某个类中的某个方法使用到了另一个类的实例,可在UML类图中使用带箭头的虚线表示这种关系,箭头方向从使用方指向被依赖方。在如图2-3中,教师类中的teach方法就需要使用到Book类的实例。
图2-3 类之间的依赖关系
关联关系比依赖关系耦合度要高,当一个类中定义的属性类型是另一个类时,这两个类就属于关联关系。关联关系可以是单向的,也可以是双向的。单向的关联关系用带箭头的实线来描述,箭头从使用方指向被关联方;双向的关联关系用带双箭头的实线描述。以教师类和学生类为例,如果教师类中定义了一个学生列表,学生类中定义了班主任教师属性,那么它们就形成了双向关联关系,如图2-4所示。
图2-4 类之间的关联关系
聚合关系也是一种关联关系,只是耦合性更高,通常表示的是部分与整体的关系,即其描述的是has-a关系。例如,我们定义一个班级类,班级类中有学生列表,则班级类与学生类就是聚合关系。注意,在聚合关系中,如果使用方不存在了,被依赖方依然可以存在。在UML类图中,使用带空心菱形箭头的实线描述聚合关系,如图2-5所示。
图2-5 类之间的聚合关系
组合关系与聚合关系类似,不同的是,当使用方不存在时,被依赖方也将不存在,这种关系下类的耦合度更强。例如,班级中包含一个班级排名的属性,则它们之间属于组合关系。在UML类图中,组合关系使用带实心菱形箭头的实线描述,如图2-6所示。
图2-6 类之间的组合关系
泛化关系与实现关系是类与类关系中耦合性最强的两种关系。其中,泛化关系是指子类与父类的关系,实现关系是指类与实现的接口的关系。在UML类图中,泛化关系使用带空心箭头的实线描述,实现关系使用带空心箭头的虚线描述,如图2-7所示。
图2-7 类直接的泛化和实现关系