提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
在软件设计与开发中,UML类图是一种极为重要的工具,它能够清晰地展示系统中类的结构、属性、方法以及类之间的关系。掌握如何绘制UML类图,对于理解系统架构、进行代码设计以及团队协作都有着不可忽视的作用。
提示:以下是本篇文章正文内容,下面案例可供参考
一、UML类图的基本构成
1. 类的表示
在UML类图中,一个类通常用一个矩形框表示,分为三个部分:类名、属性(字段)和方法。这三部分自上而下排列,用横线分隔。
- 类名:位于矩形框的顶部,是类的唯一标识。
- 属性(字段):位于中间部分,表示类的成员变量,格式为访问修饰符 属性名:属性类型。例如,- name: String表示一个私有的String类型的name属性。
- 方法:位于底部,表示类的行为,格式为访问修饰符 方法名(参数列表): 返回值类型。例如,+ run(): void表示一个公共的无参无返回值的run方法。
- 示例:一个学生类,有两个私有成员name和age,两个公共的成员函数study和displayinfo
public class Student {
private String name; // 学生姓名
private int age; // 学生年龄
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void study() {
System.out.println(name + " is studying.");
}
public void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
2. 类的修饰符
UML类图中使用特定的符号来表示类的访问修饰符:
- 表示private(私有)
+ 表示public(公共)
# 表示protected(受保护)
~ 或 * 表示default(默认,仅在Java中使用)
- 示例:
public class Person {
private String name; // 私有属性
protected int age; // 受保护属性
public String address; // 公有属性
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
protected void displayAge() {
System.out.println("Age: " + age);
}
public void displayInfo() {
System.out.println("Name: " + name + ", Address: " + address);
}
}
3. 抽象类与接口
- 抽象类:在UML类图中,抽象类的名称通常用斜体表示,以区分普通类。
- 接口:接口的名称上方会加上<>字样,以明确其为接口类型。
- 示例:
// 抽象类
public abstract class Animal {
public abstract void makeSound();
}
// 接口
public interface Movable {
void move();
}
// 具体类
public class Dog extends Animal implements Movable {
private String name;
public Dog(String name) {
this.name = name;
}
@Override
public void makeSound() {
System.out.println(name + " says: Woof!");
}
@Override
public void move() {
System.out.println(name + " is running.");
}
}
二、类之间的关系
在UML类图中,类之间的关系是通过箭头和特定的图形符号来表示的。以下是几种常见的关系及其表示方法:
1. 关联关系(Association)
关联关系表示两个类之间存在某种联系,但这种联系并不涉及所有权或整体与部分的关系。在UML类图中,关联关系用实线箭头表示,箭头指向被关联的类
。
- 示例:
public class Student {
private String name;
private Course course;
public Student(String name, Course course) {
this.name = name;
this.course = course;
}
public void displayInfo() {
System.out.println(name + " is enrolled in " + course.getName());
}
}
public class Course {
private String name;
public Course(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Student类
有一个Course
类型的属性course
,表示学生选修了一门课程。Student类
的displayInfo
方法通过调用course.getName()
来获取课程名称,展示了学生与课程之间的关联关系。
2. 聚合关系(Aggregation)
聚合关系是一种特殊的关联关系,表示整体与部分的关系,但部分可以独立于整体存在。在UML类图中,聚合关系用带有空心菱形的实线箭头表示,菱形指向整体类
。
- 示例:
import java.util.ArrayList;
import java.util.List;
public class Department {
private String name;
private List<Employee> employees;
public Department(String name) {
this.name = name;
this.employees = new ArrayList<>();
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
public void displayInfo() {
System.out.println("Department: " + name);
for (Employee emp : employees) {
System.out.println("Employee: " + emp.getName());
}
}
}
public class Employee {
private String name;
public Employee(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Department类
有一个List<Employee>
类型的属性employees
,表示部门包含多个员工。Employee类
可以独立于Department类
存在,即使没有被添加到任何部门中,员工仍然有效。Department类
的addEmployee
方法用于将员工添加到部门中,displayInfo
方法用于显示部门及其员工的信息。
3. 组合关系(Composition)
组合关系也是一种整体与部分的关系,但与聚合关系不同的是,组合关系中的部分不能独立于整体存在。在UML类图中,组合关系用带有实心菱形的实线箭头表示,菱形指向整体类
。
- 示例:
public class Computer {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public Computer(CPU cpu, Memory memory, HardDrive hardDrive) {
this.cpu = cpu;
this.memory = memory;
this.hardDrive = hardDrive;
}
public void run() {
System.out.println("Computer is running with " + cpu.getSpeed() + " GHz CPU, " + memory.getSize() + " GB memory, and " + hardDrive.getCapacity() + " GB hard drive.");
}
}
public class CPU {
private double speed;
public CPU(double speed) {
this.speed = speed;
}
public double getSpeed() {
return speed;
}
}
public class Memory {
private int size;
public Memory(int size) {
this.size = size;
}
public int getSize() {
return size;
}
}
public class HardDrive {
private int capacity;
public HardDrive(int capacity) {
this.capacity = capacity;
}
public int getCapacity() {
return capacity;
}
}
Computer类
包含CPU
、Memory
和HardDrive
三个类的实例,表示计算机由这些组件组成。CPU
、Memory
和HardDrive
类不能独立于Computer类
存在,离开了计算机,这些组件就失去了意义。Computer类
的run
方法通过调用组件的方法来展示计算机的运行状态。
4. 依赖关系(Dependency)
依赖关系表示一个类依赖于另一个类的变化。在UML类图中,依赖关系用虚线箭头表示,箭头指向被依赖的类
。
- 示例:
public class Printer {
public void print(Paper paper) {
System.out.println("Printing on " + paper.getSize() + " paper.");
}
}
public class Paper {
private String size;
public Paper(String size) {
this.size = size;
}
public String getSize() {
return size;
}
}
Printer类
的print
方法需要一个Paper类
的实例作为参数,表示打印机需要纸张才能打印。Printer类
依赖于Paper类
的变化,如果Paper类
的getSize
方法返回的尺寸格式发生变化,Printer类
的print
方法可能需要相应调整。
5. 泛化关系(Generalization)(extends)
泛化关系表示类之间的继承关系,即子类继承父类的属性和方法。在UML类图中,泛化关系用带有空心三角形的实线箭头表示,箭头指向父类
。
- 示例:
public abstract class Animal {
public abstract void makeSound();
}
public class Dog extends Animal {
private String name;
public Dog(String name) {
this.name = name;
}
@Override
public void makeSound() {
System.out.println(name + " says: Woof!");
}
}
public class Cat extends Animal {
private String name;
public Cat(String name) {
this.name = name;
}
@Override
public void makeSound() {
System.out.println(name + " says: Meow!");
}
}
Animal
是一个抽象类,定义了一个抽象方法makeSound
。Dog
和Cat
类继承自Animal类
,并实现了makeSound
方法,分别表示狗和猫的叫声。- 通过继承,
Dog
和Cat
类继承了Animal类
的属性和方法,并根据自身特点进行了扩展。
6. 实现关系(Realization)(implements)
实现关系表示一个类实现一个接口。在UML类图中,实现关系用带有空心三角形的虚线箭头表示,箭头指向接口
。
- 示例:
public interface Movable {
void move();
}
public class Car implements Movable {
private String brand;
public Car(String brand) {
this.brand = brand;
}
@Override
public void move() {
System.out.println(brand + " is moving on the road.");
}
}
public class Boat implements Movable {
private String type;
public Boat(String type) {
this.type = type;
}
@Override
public void move() {
System.out.println(type + " is moving on the water.");
}
}
Movable
是一个接口,定义了一个move
方法。Car
和Boat
类实现了Movable
接口,并根据自身特点实现了move
方法,分别表示汽车在陆地上移动和船在水面上移动。- 通过实现接口,
Car
和Boat
类提供了具体的实现细节,满足了接口的规范要求。