UML图

定义

UML(Unified Modeling Language)统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。

常见的UML图

用例图

用例图是从用户(角色)的角度出发,描述角色和用例之间的关系。即:谁要使用系统,以及他们使用系统可以做什么。简单来说就是:谁,可以用此系统做什么。
image

类图

类图是描述系统中的类,以及各个类之间的关系的静态视图。在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

泛化

泛化是一种继承关系,表示一般与特殊的关系,它指定了子类如何继承父类的所有特征和行为。
image
① 父类:Car

  • 包含公共方法:
    • +操作():所有汽车都具备的操作(如行驶)。
    • +描述():返回汽车的基本信息(如品牌、型号)。
  • 职责:定义汽车的通用行为和属性。

② 子类:Audi、BMW

  • 继承特性
    • 继承 Car 的所有方法(操作()描述())。
    • 可以重写(Override)父类方法以提供具体实现(如 Audi 的驾驶模式与 BMW 不同)。
    • 可以添加子类特有的方法或属性(如 Audi 的四驱系统)。
// 父类
class Car {
    public void 操作() {
        System.out.println("汽车正在行驶");
    }

    public String 描述() {
        return "这是一辆普通汽车";
    }
}

// 子类:Audi
class Audi extends Car {
    @Override
    public void 操作() {
        System.out.println("奥迪正在四驱模式下行驶");
    }

    @Override
    public String 描述() {
        return "这是一辆奥迪汽车";
    }
}

// 子类:BMW
class BMW extends Car {
    @Override
    public void 操作() {
        System.out.println("宝马正在运动模式下行驶");
    }

    @Override
    public String 描述() {
        return "这是一辆宝马汽车";
    }
}

实现

实现是一种类与接口的关系,表示类是接口所有特征和行为的实现。
image

  • ICar 接口

    • I 开头(常见于接口命名规范),表示这是一个接口。
    • 包含一个抽象方法 +run()+ 表示公共访问权限)。
  • Audi

    • 实现了 ICar 接口。
    • 同样包含 +run() 方法,但此处为具体实现(非抽象)。
  • 虚线箭头

    • 方向:从 Audi 指向 ICar
    • 符号含义:表示 实现关系(Realization),即 Audi 类实现了 ICar 接口的所有方法。
// 定义接口
interface ICar {
    void run();
}

// 实现接口
class Audi implements ICar {
    @Override
    public void run() {
        System.out.println("Audi is running!");
    }
}

关联

关联是一种拥有的关系,它使一个类知道另一个类的属性和方法;关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
image
① 老师 ↔ 学生(双向关联)

  • 关系:老师和学生之间存在双向依赖
  • 含义
    • 老师类可以访问学生的属性和方法(如查看学生成绩)。
    • 学生类也可以访问老师的属性和方法(如获取老师联系方式)。
  • 代码示例
    class Teacher {
        List<Student> students; // 老师管理学生
    }
    
    class Student {
        Teacher teacher; // 学生关联老师
    }
    

② 学生 → 课程(单向关联)

  • 关系:学生单方面依赖课程。
  • 含义
    • 学生类可以访问课程的属性和方法(如选课、查看课程内容)。
    • 课程类无需知晓学生的存在(除非另有设计需求)。
  • 代码示例
    class Student {
        List<Course> courses; // 学生选修课程
    }
    
    class Course {
        // 不需要引用Student类
    }
    

聚合

聚合是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
image
① 整体类:汽车

  • 汽车是整体,包含发动机和底盘两个部分。
  • 生命周期独立性:汽车销毁时,发动机和底盘仍可继续存在(如被回收或再利用)。

② 部分类:发动机、底盘

  • 发动机和底盘是汽车的组成部分,但具有独立性:
    • 发动机:可拆卸后安装到其他车辆或单独销售。
    • 底盘:可替换或单独维修。
class Car {
    private Engine engine; // 引擎属性
    private Chassis chassis; // 底盘属性

    public Car(Engine engine, Chassis chassis) {
        this.engine = engine;
        this.chassis = chassis;
    }
}

class Engine {
    // 发动机独立存在,无需依赖Car类
}

class Chassis {
    // 底盘独立存在,无需依赖Car类
}

组合

组合是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。
组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
image
① 整体类:人

  • 人是整体,包含五官和四肢两个部分。
  • 生命周期控制:当人对象被销毁时,其包含的五官和四肢对象也会自动销毁。

② 部分类:五官、四肢

  • 五官和四肢是人的组成部分,但具有以下约束:
    • 不可独立存在:离开人后无实际意义(如脱离人体的器官无法存活)。
    • 唯一归属:每个部分只能属于一个整体(如一只眼睛只能属于一个人)。
class Person {
    // 定义私有成员
    private Organs organs; // 五官
    private Limbs limbs; // 四肢

    // 构造函数
    public Person() {
        organs = new Organs(); // 创建五官
        limbs = new Limbs(); // 创建四肢
    }

    // 当Person对象被销毁时,organs和limbs也会自动销毁
}

class Organs {
    // 五官的具体实现
}

class Limbs {
    // 四肢的具体实现
}

依赖

依赖是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.
image
① 发起方:人

  • 人需要使用手机完成某些操作(如打电话、发短信)。
  • 依赖方式
    • 可能通过方法参数传递手机对象(如 call(Phone phone))。
    • 或者临时创建手机对象并调用其方法(如 new Phone().sendMessage())。

② 被依赖方:手机

  • 手机提供功能供人使用,但自身不依赖人类。
  • 职责:封装通信、拍照等具体功能。
class Person {
    // 使用手机的方法
    public void sendMessage(Phone phone) {
        phone.send("Hello!");
    }
}

class Phone {
    public void send(String message) {
        System.out.println("Sending: " + message);
    }
}

对象图

对象图和类图一样反映系统的静态过程,但它是从实际的或原型化的情景来表达的。对象图显示某时刻对象和对象之间的关系。一个UML对象图可看成一个类图的特殊用例,实例和类可在其中显示。
image
① 对象关系

  • :代表一个具体的人类对象实例。
  • 安卓手机苹果手机:代表两种具体类型的手机对象实例。
  • 关联关系
    • 人对象与两个手机对象之间存在双向关联(无箭头方向,默认为双向)。
    • 表示该人在当前时刻同时拥有/使用这两部手机。

② 实例化场景

  • 示例
    若将 视为具体实例(如 张三),则该图描述了张三同时持有两部手机(一部安卓,一部苹果)的状态。
// 类定义
class Person {
    private List<Phone> phones; // 关联多个手机对象
}

class AndroidPhone implements Phone { /* ... */ }
class IPhone implements Phone { /* ... */ }

// 对象实例化
Person zhangSan = new Person();
AndroidPhone xiaomi = new AndroidPhone();
IPhone iphone13 = new IPhone();

zhangSan.addPhone(xiaomi);
zhangSan.addPhone(iphone13);

状态图

状态图描述类的对象所有可能的状态,以及事件发生时状态的转移条件。他们可以告知一个对象可以拥有的状态,并且事件会怎么随着时间的推移来影响这些状态。
image

活动图

活动图描述用例要求所要进行的活动,以及活动间的约束关系,有利于识别并行活动。能够演示出系统中哪些地方存在功能,以及这些功能和系统中其他组件的功能如何共同满足前面使用用例图的业务需求。
活动图是状态图的一种特殊情况,这些状态大都处于活动状态。本质是一种流程图,它描述了活动到活动的控制流。
image

序列图-时序图

序列图是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型。顺序图可以用来展示对象之间是如何进行交互的。序列图将显示的重点放在消息序列上,即强调消息是如何在对象之间被发送和接收的。
序列图展示的是多个系统或者对象之间的交互的顺序,强调时间顺序。
image
① 参与者

  • APP:客户端应用,发起请求的入口。
  • 业务支撑层:中间层服务,负责业务逻辑处理。
  • 数据中心:存储数据的数据库或服务。

② 交互流程

  1. APP → 业务支撑层

    • 消息:查询列表
    • 含义:APP向业务支撑层发起数据查询请求(如获取商品列表、用户信息等)。
  2. 业务支撑层 → 数据中心

    • 消息:查询数据
    • 含义:业务支撑层转发请求到数据中心,获取具体数据。
  3. 数据中心 → 业务支撑层

    • 消息:查询数据 的返回结果(未标注,但隐含)
    • 含义:数据中心返回查询结果给业务支撑层。
  4. 业务支撑层 → APP

    • 消息:返回结果
    • 含义:业务支撑层将处理后的数据返回给APP,完成交互。

协作图

协作图和序列图相似,显示对象间的动态合作关系。可以看成是类图和顺序图的交集,协作图建模对象或者角色,以及它们彼此之间是如何通信的。
image

构件图

构件图是用来表示系统中构件与构件之间,类或接口与构件之间的关系图。其中,构建图之间的关系表现为依赖关系,定义的类或接口与类之间的关系表现为依赖关系或实现关系。
构件图 = 构件(Component)+接口(Interface)+关系(Relationship)+端口(Port)+连接器(Connector)
image

  • 核心元素
    • 构件(Component):表示可独立部署的模块(如订单系统、库存系统)。
    • 依赖关系(Dependency):用虚线箭头表示,表示一个构件使用另一个构件的功能。
    • 接口(Interface):构件对外暴露的能力(图中未明确标注,但隐含在依赖关系中)。

① 订单系统 → 库存系统(依赖关系)

  • 符号:虚线箭头 +uses
    • 表示订单系统在运行时需要调用库存系统的功能(如查询库存、扣减库存)。
  • 场景示例
    当用户下单时,订单系统会向库存系统发送请求,验证商品是否有货,并在成功后更新库存数量。

② 隐含的接口与端口

  • 接口:库存系统需提供可供订单系统调用的API(如 checkStock()deductStock())。
  • 端口:订单系统通过端口(如HTTP接口、消息队列)与库存系统通信。
// 库存系统接口
interface StockService {
    boolean checkStock(int productId);
    void deductStock(int productId, int quantity);
}

// 库存系统实现
class InventorySystem implements StockService {
    @Override
    public boolean checkStock(int productId) { /* ... */ }
    @Override
    public void deductStock(int productId, int quantity) { /* ... */ }
}

// 订单系统调用库存服务
class OrderSystem {
    private StockService stockService; // 依赖注入

    public void placeOrder(int productId, int quantity) {
        if (stockService.checkStock(productId)) {
            stockService.deductStock(productId, quantity);
            System.out.println("Order placed successfully!");
        } else {
            System.out.println("Out of stock!");
        }
    }
}

部署图

部署图又叫配置图,是用来建模系统的物理部署。
部署图由节点以及节点之间的关系组成。
部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。
image
① 节点角色

  • 数据库服务器

    • 存储系统的核心数据(如用户信息、订单记录等)。
    • 部署软件:数据库管理系统(如MySQL、MongoDB)。
  • 应用服务器

    • 执行业务逻辑(如订单处理、权限验证)。
    • 部署软件:中间件(如Tomcat、Spring Boot)。
  • Web服务器

    • 处理HTTP请求并返回响应(如网页、API)。
    • 部署软件:Web服务器(如Nginx、Apache)。
  • 客户端

    • 用户终端(如浏览器、移动App),发起请求。

② 连接关系

  • 数据库服务器 ↔ 应用服务器
    • 应用服务器通过数据库接口(如JDBC)读写数据。
  • 应用服务器 ↔ Web服务器
    • Web服务器将请求转发给应用服务器处理。
  • Web服务器 ↔ 客户端
    • 客户端通过HTTP/HTTPS协议访问Web服务器。
posted @ 2025-03-29 23:17  最爱丁珰  阅读(160)  评论(0)    收藏  举报