类图
1.类
类即对真实世界中客观存在事物的一个抽象描述,
就像常说的人类,人这个类;你、我都是一个对人的实例化,就是一个对象。
在实际应用中类又分为实体类、控制类、边界类。
利用UML的图形绘制类
1)可见性
用于描述类的属性和操作可见性,分为
Public(公有)用画图时“+”表示。
Protected(保护)用“#”表示。
Private(私有)用“-”表示。
Package(包内公有)用“~”表示,一般较少用
上面的图是用Rational Rose画的,表示形式稍有不同,用图画的形式表现了出来。
2)表示方法
在UML类图中,一般由类名、属性、操作三部分组成
第一部分是类名:每个类都需要有一个名字
第二部分是属性:一个类可以没有,也可以有多个属性。
类图中属性的表示方式(在类图中每个属性的组成部分):
[可见性] 属性名 [一个还是多个]:[属性类型][初值][{属性字符串}]
第三部分是操作:
类图中操作的表示方式:
[可见性] 方法名 [参数列表]:[返回类型][{属性字符串}]
2.类的关系
类图的核心
1)关联关系
(1)普通关联关系
一般说关联关系时,只是单单的指普通关联关系。
关联关系是类与类之间最常用的一种关系,是一种结构化关系。
a)双向关联
默认情况下关联是双向的。在UML图中用一条实线连接两个类
b)单向关联
关联关系也可以是单向的,用带箭头的实线表示。看了前辈的博客,举例如:顾客(Customer)拥有地址(Address)则Customer类与Adress类具有单向关联关系,但是我还是没有想通。
应用于关联的修饰
a)名称:用以描述该关系的性质。
b)角色:当一个类处于关联某一端时,该类就在这个关系中扮演了一个特定的角色;角色是关联中靠近它的一端类对另一端的类呈现的职责
c)多重性:关联角色的多重性是说明一个关联实例中有多少个相互连接的对象
表示方式 | 多重性说明 |
1...1 | 表示另一个类的一个对象只与该类的一个对象有关系 |
0...* | 表示另一个类的一个对象与该类的零个或多个对象有关系 |
1...* | 表示另一个类的一个对象与该类的一个或多个对象有关系 |
0...1 | 表示另一个类的一个对象没有或只与该类的一个对象有关系 |
m...n | 表示另一个类的一个对象与该类最少有m,最多有n个有关系 |
d)关联类:两个对象之间的连接(Link)本身可以拥有自己的属性和行为,如果把连接看做是一个类的实例,则成为关联类。
e)自身关联:系统中存在一些类的属性对象类型为该类本身,这种特殊的关联关系成为自关联。
(2)聚合关系&组合关系
两个关系都是描述整体和部分的关系,其实这两个关系挺好区分的,从名字上就可以直观的看出。
聚合就是几个东西聚到了一起变成了另一个名字,就像初高中刚开学班主任常说的,大家因为缘分聚到了一起组成了我们现在的某某班。是一种松耦合关系。
组合就是更加紧密的整体和部分的关系,存在一种依附关系。先有整体再有个体,没有整体也就没有个体。是一种紧耦合关系。
下面是两个关系的一个比较。
2)依赖关系
依赖关系是一种使用关系,一个事物的改变可能会影响到使用这个事物的其他事物,这时就需要依赖关系来表示两个事物之间的关系。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
在系统实施阶段,依赖关系通常通过三种方式来实现。
第一种也是最常用的一种方式,将一个类的对象作为另一个类中方法的参数
第二种方式是在一个类的方法中将另一个类的对象作为局部变量
第三种方式是在一个类的方法中调用另一个类的静态方法。
举个例子:驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此类Driver依赖类Car。
3)泛化关系
泛化关系就是继承关系,如果泛化这个词不好理解的话,那继承呢,从小我们就一直在唱“我们是共产主义接班人,继承了革命先辈的光荣传统。”至于继承了什么就多说无益哈。
不过在类的继承中就不能任你这么挑剔了,不能你说只继承光荣的就继承光荣的,想继承就全拿走,不继承就什么也别碰。
一个类继承另一个类,‘另一个类’ 拥有 ‘一个类’ 的所有属性及方法,并且可以增加新的属性及方法。
一个类继承另一个类,‘一个类’ 叫做子类或者派生类,‘另一个类’ 叫做父类、基类或者是超类。就像你是你父亲的孩子,你有你爸的基因,你就是子类,你爸就是父类,具体我也不知道为什么不叫‘母类’,我想大概有点不好听,像骂人吧。
继承又分为单重继承和多重继承。
如果上面的理解了,从名字上就能轻松的区分,单重继承就是一个子类有且只有一个父类,多重继承就是一个子类有两个或两个以上的父类。
4)实现关系
实现关系指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系。
这里就先引入一个接口的概念。
接口:在接口中通常没有属性,对于操作,所有操作都是抽象的,不过只有操作的声明,没有操作的实现。
接口之间也可以有类之间的继承和依赖关系。而接口和类之间还存在一种实现关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作。
在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。
比如:定义了一个交通工具接口Vehicle,包含一个抽象操作move(),在类Ship和类Car中都实现了该move()操作,不过具体的实现细节有所不同。下图中因为rose软件的问题,在图中是用实现表示的,但是在画的时候还是要用上面说的线画。