UML类图介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在软件设计与开发中,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);
    }
}

对应UML类图

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);
    }
}

对应UML类图

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类图

二、类之间的关系

在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()来获取课程名称,展示了学生与课程之间的关联关系。
    对应UML类图

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方法用于显示部门及其员工的信息。
    对应的UML类图

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类包含CPUMemoryHardDrive三个类的实例,表示计算机由这些组件组成。
  • CPUMemoryHardDrive类不能独立于Computer类存在,离开了计算机,这些组件就失去了意义。
  • Computer类run方法通过调用组件的方法来展示计算机的运行状态。
    对应UML类图

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方法可能需要相应调整。
    对应UML类图

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
  • DogCat类继承自Animal类,并实现了makeSound方法,分别表示狗和猫的叫声。
  • 通过继承,DogCat类继承了Animal类的属性和方法,并根据自身特点进行了扩展。
    对应的UML类图

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方法。
  • CarBoat类实现了Movable接口,并根据自身特点实现了move方法,分别表示汽车在陆地上移动和船在水面上移动。
  • 通过实现接口,CarBoat类提供了具体的实现细节,满足了接口的规范要求。
    对应的UML类图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值