一 、类图概述
1、类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法
2、类图中的“类”与面向对象语言中的“类”的概念是对应的,是对现实世界中的事物的抽象
二、类图中的事物
从上到下分为三部分,分别是类名、属性和操作。类名是必须有的
※ 类如果有属性,则每一个属性都必须有一个名字,另外还可以有其它的描述信息,如可见性、数据类型、缺省值等
※ 类如果有操作,则每一个操作也都有一个名字,其它可选的信息包括可见性、参数的名字、参数类型、参数缺省值和操作的返回值的类型等
三 、类图中的关系
类之间的关系 | 解释 | UML表示 | |
关联关系 | 关联(Association) | 对象之间一种引用关系,比如客户类与订单类之间的关系。这 种关系通常使用类的属性表达。关联又分为一般关联、聚合关联与组合关联。后两种在后面分析。在类图使用带箭头的实线表示,箭头从使用类指向被关联的类。可以是单向和双向。 |
|
聚合(Aggregation) | 表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体。 |
| |
组合(Composition) | 表示contains-a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。是一种更强的聚合关系。部分不能脱离整体存在。如公司和部门的关系,没有了公司,部门也不能存在了;调查问卷中问题和选项的关系;订单和订单选项的关系。在类图使用实心的菱形表示,菱形从局部指向整体。 |
| |
依赖关系 | 依赖(Dependency) | 对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类。 |
|
泛化关系 | 泛化(generalization) | 表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。在类图中使用带三角箭头的实线表示,箭头从子类指向父类。 | |
实现关系 | 实现(Realization) | 在类图中就是接口和实现的关系。在类图中使用带三角箭头的虚线表示,箭头从实现类指向接口。 |
各种关系的强弱顺序: 泛化= 实现> 组合> 聚合> 关联> 依赖
四 、举例分析
4.1 依赖
【依赖关系】:是一种使用的关系,所以要尽量不使用双向的互相依赖。
【代码表现】:局部变量、方法的参数或者对静态方法的调用
/**
* @author ***
* @version 1.0
* @date 2021/3/22 13:52
* <p>
* 学生类
* ------------------------依赖关系------------------
* <p>
* Student与Phone是关联关系,Phone是类的成员变量,Student与Phone是平等的,不存在包含关系
* <p>
* Student与Computer是依赖关系,Computer是局部变量,
* 持有Computer类的是Student类的一个方法,而不是Student类,这点是最重要的。
* 基础知识: 成员变量包括实例变量和类变量
*/
public class Student {
/**
* 类变量
*/
private static final boolean flag = true;
/**
* 实例变量
*/
private String studentName;
private String studentSex;
private int studentAge;
private Phone phone;
public Student() {
}
public void getHappiness() {
phone = new Phone();
}
/**
* 学习上课时候才引入了Computer
*/
public void study() {
Computer computer = new Computer();
}
}
/**
* @author ***
* @version 1.0
* @date 2021/3/22 14:56
*
* 电脑类
*/
public class Computer {
private String computerColor;
private String memory;
public void run() {
}
}
类图:
4.2 关联
【关联关系】:关联的两个对象之间一般是平等的,关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量
表示类与类之间的连接。它使一个类的可见属性和方法被另一个类使用。关联可以是双向或者单向的。双向的关联箭头是可选的,单向的箭头指向遍历或者查询的方向。在Java中,关联使用实例变量来实现。在关联关系中可以使用附加的基数来说明类之间对应的个数。
基数 | 含义 |
0..1 | 零个或者一个实例 |
0..n或者n | 没有限制,任意 |
1 | 有且只能一个实例 |
1..n | 至少有一个实例 |
/**
* @author ***
* @version 1.0
* @date 2021/3/22 15:08
*
*-----------------------关联关系------------------
* 电话类
*/
public class Phone {
/**
* 电话品牌
*/
private String phoneBrand;
}
类图:
4.3 聚合
/**
* @author ***
* @version 1.0
* @date 2021/3/22 15:00
* <p>
* ---------------------聚合关系----------------------
* 学生和小组是聚合关系,学生离开当前小组,依然可以去其它小组,学生独立存在
*/
public class Group {
private String groupName;
private int groupScore;
private Student student;
public void getScore() {
student = new Student();
this.groupScore += 10;
}
}
类图:
4.4 组合
/**
* @author ***
* @version 1.0
* @date 2021/3/22 15:06
*
* 班级信息类
* ------------------------组合关系 ------------------------
* 小组脱离班级不能存在
*/
public class ClassInfo {
private String className;
private Group group;
public void grouping() {
group = new Group();
}
}
类图:
4.5 泛化
/**
* @author ***
* @version 1.0
* @date 2021/3/27 15:50
*/
public class Human {
private double height;
private double weight;
}
public class Student extends Human {
// 省略 同上
}
类图:
4.5 实现
/**
* @author ***
* @version 1.0
* @date 2021/3/27 15:58
*/
public interface Action {
public default boolean exam(int score) {
/***/
boolean flag = false;
if (score >= 60) {
flag = true;
}
return flag;
}
}
public class Student extends Human implements Action{
// 省略 同上
}
类图: