一、UML
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计种的动态与静态信息。
UML,从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。
一、类图
1.类图概述
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类,类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。
2.类图的作用
在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解。
类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。
3.类图表示法
3.1类的表示方式
在UML类图中,类使用包含类名、属性(filed)和方法(method)且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和address这三个属性,以及work()方法。
属性/方法名称前加的加号和减号表示这个属性/方法的可见性,UML类图中表示可见性的符合有三种:
- +:表示public
- -: 表示private
- #: 表示protected
属性的完整表示方式是:可见性 名称 :类型 [ = 缺省值]
方法的完整表示方式是:可见性 名称(参数列表) [ : 返回类型]
注意:
1.中括号中的内容表示是可选的
2.也有将类型放在变量名前面,返回值类型放在方法名前面
举例:
3.2类与类之间关系的表示方式
3.2.1关联关系
关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为关联关系、聚合关系和组合关系。
关联又可以分为单向关联,双向关联,自关联。
(1)单向关联
在UML类图中单向关联用一个带箭头的实线表示。下图表示每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。
(2)双向关联
从下图中看出,所谓的双向关联就是双方各自持有对方类型的成员变量。在UML图中,双向关联用一个不带箭头的直线表示。下图中在Customer类中维护一个List,表示一个顾客可以购多个商品;在Product类中维护一个Customer类型的成员变量表示这个产品被哪个顾客所购买。
(3)自关联
自关联在UML类图中用一个带有箭头且指向自身的线表示。下图的意思就是Node类包含类型为Node的成员变量,也就是"自己包含自己"。【LinkedList底层用到了自关联】
3.2.2聚合关联
关联关系的一种,而且它是强关联关系,是整体和部分之间的关系。如下图所示,以大学和老师为例,大学属于整体,老师就属于部分。
关于聚合关系,我们需要知道聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。从上图中可以看到,在大学里面,是有成员的,而且成员还是另外一种类型(即老师)的对象,只不过它是放在了一个集合里面,所以我们才说聚合关系是通过成员对象来实现的;其次,由于大学是一个整体,而老师是部分,也即成员对象,所以很显然成员对象是整体对象的一部分;最后,一个大学肯定会有多位老师,如果这个大学停办了,或者说这个大学没落了,那么老师是还依旧存在的,他还可以到其他的学校继续任职,所以我们才说成员对象可以脱离整体对象而独立存在。在UML类图中,聚合关系可以用带空心菱形的实线来表示,而且菱形指向整体。在上图中,老师是属于部分,大学是属于整体,所以空心菱形就得指向于大学这一边
3.2.3组合关系
组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。
在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,头属于整体,嘴属于部分,没有了头,嘴也就不存在了,因为嘴是依赖于头而存在的。
在UML类图中,组合关系用带实心菱形的实线来表示,而且菱形指向整体。对于组合关系而言,如果整体不存在了,那么部分肯定不复存在了。
3.2.4依赖关系
依赖关系是一种使用关系(在我们平时定义类的时候特别常用),它是对象之间耦合度最弱的一种关联关系,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另外一个类(被依赖类)中的某些方法来完成一些职责。
在UML类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。下图所示是司机和汽车的关联关系图,司机驾驶汽车:
3.2.5继承关系
继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系。当两个类有了继承关系之后,如果我们在父类中定义了一个成员,不管是成员变量还是成员方法,那么子类都会继承过来,所以耦合度就特别高。
在UML类图中,泛化关系也被称为继承关系(也可以说泛化关系表示的其实就是继承关系),只不过这一块我没有单独去说它。那么,泛化关系在类图中是如何来表示的呢?泛化关系在UML类图中是用带空心三角箭头的实线来表示的,而且箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系(或者说继承关系),这个想必大家应该很熟了。例如,Student类和Teacher类都是Person类的子类,其类图如下图所示。
3.2.6实现关系
实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
在UML类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。例如,汽车和船实现了交通工具,其类图如图所示。在Vehicle上面有一个<<Interface>>这样的标识,这表明了Vehicle是一个接口,而且,该接口又有两个子实现类,只因它们上面没有声明<<Interface>>。
参考链接:
【1】使用Emacs敲出UML,PlantUML快速指南
【2】顺序图的语法和功能
【3】软件设计原则篇:开闭原则
【4】从零开始学习Java设计模式_李阿昀的博客-CSDN博客