类图
本节主要内容
类图
顺序图
状态图
类与类之间关系的含义、符号表示和代码实现以及顺序图和状态图的绘制
其中最重要的是类图,类图,类图!重要的事情说3遍好吧!
UML简介
UML的全拼是Unified Modeling Language
,表示的是统一建模语言。
-
UML的结构
1、视图:包括了用户视图、结构视图、行为视图、实现视图、环境视图
2、图:包括了用例图、类图、对象图、包图、组合结构图、状态图、活动图、顺序图、通信图、定时图、交互概览图、组件图、部署图。
3、模型元素:包括事物以及事物之间的联系,事物可以代表任何可以定义的东西。每一个模型元素都有一个与之相对应的图形元素,如类、对象、消息、组件、节点等事物以及它们之间的关系,比如关联、泛化、依赖等。
4、通用机制:为模型元素提供额外的注释、修饰、语义等,主要包括规格说明、修饰、公共分类和扩展机制四种。
-
UML的特点
1、工程化
2、规范化
3、可视化
4、系统化
5、文档化
6、智能化
类图
类图是使用频率最高的UML图之一。包含了:属性,行为(java中就叫做方法),类之间的关系。类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。
属性表示:
可见性 名称:类型 [ = 默认值]
规定操作表示:
可见性 名称(参数列表)[ : 返回值类型]
例:一个Student类,包含不同修饰符的属性,无参数无返回值的构造器,有返回值的get方法,返回为void、有一个参数的set方法。代码如下:
public class Student {
public String name;
protected String sex;
int age;
private float javaScore = 100L;
public Student() {
}
public float getJavaScore() {
return javaScore;
}
public void setJavaScore(float javaScore) {
this.javaScore = javaScore;
}
/**
* 内部类
* @author Feng
* 2018年5月7日下午12:48:11
*/
class Monitor{
}
}
其对应的类图是:
根据上图,可以看到,属性的修饰符有以下特点:
其实,方法的修饰符也是如此的。
内部类的表示并不多见,找了2种画图的软件还是没找见这种功能,就只能先画一个类似的放着了。
还有包内可见的【*】也是没有找到。因为使用更多的是public、protected、public。
抽象类
其绘图方式、格式与普通类无异,只是类名使用斜体字。或者使用{Abstract}标记一下。
例如下图(使用了斜体字):
接口
通常使用<<interface>>
来标记。例如:
类之间的关系
谈及类之间的关系,常见的有继承,实现(类与接口之间),敢问兄台还能想到啥呢?
这里的类之间的关系在定义上和名字上与继承等关系稍有不同!
UML中,类之间的关系主要有:
1. 关联关系
是类与类之间最最常见的一种关系,用于表示一类对象与另一类对象之间有联系。通常将一个类的对象作为另一个类的属性。
在使用类图表示关系时可以在关联线上标注角色名,一般使用一个表示两者之间的关系的动词或名词表示角色名(并不是必须要写的)
最简单的关联关系:
public class Score {
}
class AverageScore{
private Score score;
}
使用类图表示就是:
其实关联还可以细分:双向关联、单向关联、自关联、多重性关联、聚合关系、组合关系。
1.1 单向关联
使用带箭头的实线表示,就比如平均成绩AverageScore
中声明了一个返回值为Score
的变量。对的,所以上边那个例子就是一个单向关联。
1.2 双向关联
默认情况下是双向的,使用不带箭头的实线表示。
例如:class Teacher {
private Student[] students;
}
class Student{
private Teacher myTeacher;
}
以上程序的类图是:
可以描述为:一个老师教好多个学生,学生都有同一个老师。
1.3 自关联
在系统中可能会存在一些类的属性对象类型为其本身,这种特殊的关联称为自关联。一般地,单例模式就是一个典型的自关联。
比如:这是一个特殊的管理者,在类成员的位置上声明了自己本身,这就是自关联。
public class SpecialManager {
private SpecialManager specialManager;
}
其类图如下:
1.4 多重性关联
多重性关联关系又称为重数性关联关系(Multiplicity
),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关联关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
例子:
一个老师有一群学生(或0个),但是一个学生只属于一个老师。
1.5 聚合关系
表示一个整体与部分的关系,在聚合关系中,成员类是整体的一部分,即就是成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。
最最最典型的例子是:汽车发动机和汽车的关系,它们就是一个聚合关系。
例子:
/**
* 汽车类
* @author Feng
* 2018年5月7日下午3:17:38
*/
class Vehicle {
private Engine engine;
public Vehicle(Engine engine) {
this.engine = engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
}
/**
* 发动机类
* @author Feng
* 2018年5月7日下午3:17:30
*/
class Engine{
}
类图:
在上边的汽车类中,成员变量是一个发动机类型的,因为这是聚合(该变量可以脱离整体,就像是汽车的发动机坏了还能换新的,发动机也可以单独存在,所以不能直接实例化该发动机),所以使用有参数的构造器将外部实例化好的Engine对象传入到汽车类中,这个传入的过程叫做注入(Injection)。
所以,部分与整体之间不存在制约的生命周期,这也是聚合关系的一大特点。
1.6 组合关系
与聚合关系相比较,也是整体与部分之间的关系。
它们的区别是:聚合关系中的{部分}是可以改的,就像是汽车可以换发动机;但是,组合关系中的{部分}却是不能修改的,就像是人与脑袋的关系(斜脸笑)。
例子:
class Man {
private Head head;
public Man() {
head = new Head();
}
}
class Head{
}
类图:
组合关系中,整体可以控制部分的生命周期。
另外,聚合和组合关系中,表示“部分”的那个类可以写在整体的内部,作为一个内部类出现。它们的共同点是,一个类的实例是另一个类的成员对象。
2. 依赖关系
依赖关系是一种使用关系:在需要表示一个事物使用另一个事物时使用依赖关系。在UML类图中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
例子:程序员(Programmer
)使用计算机(Computer
)
class Computer {
/**
* 计算机运行。
*/
public void run() {
}
}
class Programmer {
/**
* 程序员工作:使用计算机。调用计算机类中的运行的方法。
* @param computer 计算机。
*/
public void onWork(Computer computer) {
computer.run();
}
}
类图:
注意:
在具体实现时,如果一个类的方法中调用了另一个类的静态方法,或在一个类的方法中定义了另一个类的对象作为其局部变量也是依赖关系中的一种表现形式,在设计阶段暂不考虑。
3. 泛化关系
其实就是继承关系(满足is a kind of
),泛化关系用于描述父类与子类之间的关系。
父类也叫做基类或者超类,子类又称作派生类。
在UML中,使用带空心三角形的直线来表示。代码实现时,也是使用继承来实现泛化的。
例子:
/**
* 超类:动物类。
* @author Feng
* 2018年5月7日下午4:13:35
*/
class Animal {
private String name;//动物的名字
private int age;//动物的年龄
public void eat() {
}
public void sleep() {
}
}
/**
* 猴子继承了动物类。
* @author Feng
* 2018年5月7日下午4:13:20
*/
class Monkey extends Animal{
private String MonkeyNumber;//猴子的编号
public void eat() {
super.eat();
}
}
类图:
4. 实现关系
类与接口之间。相当于一个类实现了一个接口。
例子:
结语
类图:用于结构视图,类图使用类来描述系统的静态结构,类图包含类和它们之间的关系,它描述系统内所声明的类,但它没有描述系统运行时类的行为。
类图一般有3部分:
1. 类名:每个类都必须有一个名字,类名是一个字符串。
2. 属性(Attributes):属性是指类的性质,即类的成员变量。
3. 类的操作(Operations):操作是类的任意一个实例对象都可以使用的行为,操作是指类的成员方法。