目录
百度百科对类图的定义
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。
它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。类图也可用于数据建模。
在java学习中,类图大致就是描述自己的类中属性和方法, 自己类与其他类的关系, 用一些通用的规则,方便读者看到时能够理解
从一个简单的Person类开始
使用到的工具是idea2020
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
生成Person的类图
在idea中找到 FIle->Settings -> Tools -> Diagrams
一般情况下,只需要关注成员变量,方法,构造器,所以选中
然后打开Person类, 使用快捷键ctrl + alt +u 可以快速生成类图
当然,使用IDEA生成的类图,可能与书籍上的有所差异,
使用smartUML生成类图,操作步骤见 附录: smartuml
这就是常见的uml类图
其中,属性的规范
可见性 名称:类型 [ = 默认值 ]
这里的可见性,对应java的 public(+), private(-), protected(#)
名称就是属性的name
类型就是属性对应的数据类型
如果有默认值也可以加上
方法的规范
可见性 名称(参数列表) [ : 返回类型]
方法的可见性与属性一致,
名称就是方法名
参数列表,如果有多个,使用逗号隔开
类与类之间的关系
在UML类图中类与类之间存在多种关系,如泛化(Generalization)关系,实现(Realization)关系,依赖(Dependence)关系,关联(Association)关系,聚合(Aggregation)关系, 组合(Composition)关系。
泛化关系
泛化关系也就是Java中的继承,类和类,接口和接口都可以是继承关系,父类又称作基类或超类,子类又称作派生类,类继承父类后可以实现父类的所以功能,并能拥有父类没有的功能。在UML中,泛化关系可以用带空心三角形的直线来表示;
public class Student extends Person{
private String classroom;
public void setClassroom(String classroom) {
this.classroom = classroom;
}
public String getClassroom() {
return classroom;
}
}
使用smartUML生成类图
实现关系
Animal
public interface Animal {
void say();
}
更新Person
public class Person implements Animal{
...
@Override
public void say() {
System.out.println("我是Person");
}
}
Pig也是Animal
public class Pig implements Animal {
@Override
public void say() {
System.out.println("我是 Pig");
}
}
Student也say
public class Student extends Person{
private String classroom;
public void setClassroom(String classroom) {
this.classroom = classroom;
}
public String getClassroom() {
return classroom;
}
@Override
public void say() {
System.out.println("我是student");
}
}
生成类图 interface中的say()方法, smartUML默认的可见性是package, 使用~表示
依赖关系
依赖关系是类与类之间最弱的关系,依赖可以简单的理解一个类使用了另一个类,这种使用关系具有临时性特征,但是一个类又会由于另一个类的改变而受到影响,在UML中一栏用带箭头的虚线表示依赖. A类中有B类型的局部变量,就说A类依赖于B类。
Student eat Pig
pig200斤
public class Pig implements Animal {
@Override
public void say() {
System.out.println("我是 Pig");
}
public int getWeight() {
return 200;
}
}
public class Student extends Person{
private String classroom;
public void setClassroom(String classroom) {
this.classroom = classroom;
}
public String getClassroom() {
return classroom;
}
@Override
public void say() {
System.out.println("我是student");
}
public int eat(Pig pig) {
return pig.getWeight();
}
}
自动生成的类图中没有依赖关系,需要手动添加
使用powerdesigner生成类图会比smartUML更加方便快捷
但是自动生成的没有依赖关系(可能是我对工具的使用不够熟练), 手动添加依赖关系
关联关系
关联关系表示一个类和另一类有联系,例如每个学生都有一个地址,就形成了一对一的关联关系
关联关系是一种包含关系,在UML中用一个带箭头的实线表示,箭头指向被包含类。在上图中你可能会发现在线上有1 ..1,这个是说明包含关系的。在UML类中有如下几种。
1..1 表示另一个类的一个对象只与该类的一个对象有关系
0..* 表示另一个类的一个对象与该类的零个或多个对象有关系
1..* 表示另一个类的一个对象与该类的一个或多个对象有关系
0..1 表示另一个类的一个对象没有或只与该类的一个对象有关系
* 任意多个对象关联
public class Student extends Person{
private String classroom;
private Address address;
public void setClassroom(String classroom) {
this.classroom = classroom;
}
public String getClassroom() {
return classroom;
}
@Override
public void say() {
System.out.println("我是student, Address");
}
public int eat(Pig pig) {
return pig.getWeight();
}
}
在Address中也包含一个Student
public class Address {
private String city;
private String country;
private Student student;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
如果一个Address有多个Student
public class Address {
private String city;
private String country;
private Student [] student;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
聚合关系
聚合关系是表示整体与部分的关系,但是部分可以脱离整体而存在。例如有一个Group, 里面有多个Student。在UML类中聚合关系用带空心菱形的直线表示。 空心菱形表示聚合,指向one端。
public class Group {
private String name;
private Student [] students;
public Group() {
this.students = new Student[10];
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
组合关系
组合关系也是一种部分和整体的关系,但是部分存活周期受到整体的影响,若整体不存在则部分也将不存在。此时部分需在整体的构造方法中创建。在UML类中,组合关系用带实心菱形的直线表示。例如学生拥有学生证,学生退学之后,学生证也失效
public class Student extends Person{
private String classroom;
private Address address;
private StudentCard studentCard;
public Student() {
studentCard = new StudentCard();
studentCard.setId(12345678);
}
...
}
public class StudentCard {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
使用powerdesigner自动生成之后,需要手动改变下关系的类型
完整的类图如下
附录1: smartuml
下载安装 smartuml 4.0
安装nodejs
安装asar
npm install -g asar
找到文件路径
win10 路径 C:\Program Files\StarUML\resources
解压app.asar
修改 app\src\engine\license-manager.js
checkLicenseValidity
重新打包执行,即可跳过激活
注意: 必须以管理员身份打开cmd,否则会提示权限不足
安装java代码的支持
安装完成之后重启
找到源文件所在的文件夹, 双击Overview,即可出现,
然后点击类图中的Person框, 完善类图
附录2: powerdesigner
安装及破解文件地址:
使用时,直接 File -> new model
确定之后,选择language , 找到Reverse Engineer Java
点击add, 将要生成类图的类添加进来, powerdesign只能生成同一个文件夹下的java类图
点击确定,即可
然后找到对应的model下面的文件,即可看到已自动生成的类图