类图基本语法

在UML中,画每一种图,都有一套规范的,不同的符号是不同的意义,我们要熟悉这些符号的意义,才能理解一副类图的意义。

先来一副画好的类图,从解析这个类图开始:

如图,这是一副很简单的类图,很简单,也很熟悉。

可以看到,这个类图,从上到下分为三部分。是的,一般类图从上到下分为三部分,分别是:

类名

属性

操作

正如你所看到的,上面名称是Student,属性有Name, Sex, Age, 对应的操作有六个。你应该知道一个类图的Student是必须存在的,而属性和操作是可选的。如果,你看到了一个没有任何属性和操作的类时,也不要感到惊讶,那是正确,虽然不是很正常。

类的名字没有什么好说的,那么,我从属性开始,例如以下属性:

打开网易新闻 查看精彩图片

分享之前我还是要推荐下我自己创建的大数据学习资料分享群 232840209,这是全国最大的大数据学习交流的地方,2000人聚集,不管你是小白还是大牛,小编我都挺欢迎,今天的源码已经上传到群文件,不定期分享干货,包括我自己整理的一份最新的适合2017年学习的前端资料和零基础入门教程,欢迎初学和进阶中的小伙伴。

- Name:String

如果你看过Objective-C,你也许就不会感到惊讶,为什么有减号和加号了,但是,伙计,这里的减号和加号和Objective-C中的意思是完全不同的。

这里的加号和减号表示的是属性和方法的可访问性,有如下定义:

-表示private

+表示public

#表示protected

Name表示的是属性的名称,而它后面的String表示的是这个属性的类型;

那么现在对于- Name:String就好理解了;它表示Student类中定义的一个私有的String类型的属性Name;而对于图中这样的一个特例:

- Age:int=10

在这里,int=10,表示的Age属性的默认值为10。

最下面是类的操作,“+”的意思,已经解释过了。我选取以下的一个操作进行详细讲解:

+ SetAge(Age:int):void

操作名为SetAge,参数为int类型的Age,操作的返回值为void。有的时候,我们会遇到以下的这种语法:

+ SetAge(in Age:int):void

是的,多了一个in关键字,这个关键字表示这个Age参数是输入参数,如果看过C#的话,理解其中的out关键字,我想in就不用我多讲了。

抽象类

看下面这个图:

打开网易新闻 查看精彩图片

你会发现类名和Eat方法是以斜体表示的;在类图中以斜体表示也是有特殊意义的,上图表示Animal是一个抽象类,抽象类是不能实例化的,一般至少包含一个抽象操作,比如上图的Eat就是抽象操作。

接口

看下图这个图:

打开网易新闻 查看精彩图片

这是接口的表示方法。接口是什么,不用做什么解释。这里让大家对接口图有一个大体的了解。

类图之间关系

对于类图的基本讲解就到这里了,接下来讲解类图中最重要的一部分,也是比较难理解的一部分:类图之间的关系。

一个负责的系统,每个类不是独立存在的,而是类与类组织起来的,而每个类之间的关系是错综复杂的,那么UML是如何表达其中的关系的呢?

继承关系

继承关系是一种基本而重要的关系;至于继承的概念,我就不做解释了,而只讲UML中对继承的表示。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

以上两张图,是对继承关系的表示方法,继承通过指向超类的一条闭合的,单箭头的实线表示。这个表示和用例图中的泛化表示方式是一致的。

关联关系

当系统建模时,特定的对象间会彼此关联,而且这些关联本身需要被清晰地建模,这里我会介绍5中关联,关于什么时候使用哪种关联,这里是不做介绍的,这里而是将重点集中在每种关联的用途,并说明如何在类图上表现出来。

双向的关联

打开网易新闻 查看精彩图片

关联是两个类之间的连接,关联总是被假定是双向;这说明,两个类彼此知道它们之间的关系,都可以调用对方的公共属性和方法;虽然在分析阶段这种关系是适用的,但我觉得对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针;对象引用本身就是有向的。这种关系在设计的时候比较少用到,关联一般都是有向的。

单向关联

在一个单向关联中,两个类是相关的,但是只有一个类知道这种关系的存在。如下图:

打开网易新闻 查看精彩图片

一个单向的关联,表示为一条带有指向已知类的开放箭头的实线。Class0知道Class1的存在,而Class1不知道Class0的存在,Class0可以调用Class1的公共属性和方法。单向关联体现为Class0中包含一个Class1对象。

关联类

打开网易新闻 查看精彩图片

Person和Company是有关系的,存在什么关系?存在一个雇佣的关系,由于存在一个Job,导致Person和Company产生了关系,但是在建模时,由于Job将Person和Company关联到了一起,而描述Job的Salary放在Person或者Company都不是很合适的,由于不同的岗位有不同的Salary,如果将岗位和Salary放在Person,将导致Person类存在很高的耦合性。所以关联出一个关联类Job,表示岗位信息。从图中可以看出,Job类即是一个关联关系也是一个类,是为了描述类Person与类Company之间的关联关系的。

聚合

聚合是一种特别类型的关联,用于描述“总体到局部”的关系。

基本聚合

在基本聚合中,部分类的生命周期独立于整体类的生命周期;如下图:

打开网易新闻 查看精彩图片

房子是一个整体实体,而窗户是房子的一部分,而窗户可以在建房子之前就创建,在这里,Window实例清楚地独立地Car类实例而存在。使用空心的菱形表示。

组合聚合

组合聚合也叫包容,但是子类实例的生命周期依赖于父类实例的生命周期;如下图:

打开网易新闻 查看精彩图片

公司是一个整体实体,公司包含部门,部门不能独立于公司而存在。使用实心菱形表示。

自身关联(反射关联)

就是自身关联自身,你可能想不到这样存在的意义,但是,你要想到,类可以是抽象的,当一个类关联到它本身时,这并不意味着类的实例与它本身相关,而是类的一个实例与类的另一个实例相关,可以表现为多态,在UML中就是如下图所示:

打开网易新闻 查看精彩图片

实现接口

如下图:

打开网易新闻 查看精彩图片

在UML中表示的很简单,就是将泛化中的实线变成了虚线就好。