UML 是一种分析设计语言,也就是一种建模语言。

UML结构解析

UML其结构主要包括以下几个部分:

  • 视图(View)

    多个图形组成的集合;
  • 图(Diagram)

    图的种类有13种图,但常用的也就两种(1.需求用例图,2.开发类图);
  • 模型元素(Model Element)

    如类、对象、消息以及这些概念之间的关系,如关联关系、依赖关系、泛化关系等;
  • 通用机制(General Mechanism)

    UML提供的通用机制为模型元素提供额外的注释、信息和语义(没啥用);

开发类图

类图(Class Diagram)主要用来描述不同的类以及它们之间的关系。

类图的三段式结构为:

类名
类的属性
类的操作

类图示例

对应的Java代码

观察后发现,图和代码的差别不大,无非是类型写在变量后面而已。

UML规定类属性的表示方式为:

UML规定类操作的表示方式为:



注意:如果是构造方法,则无返回类型。

其中:可见性表示该属性对于类外的元素而言是否可见,包括:

  • 公有(public), 在类图中分别用符号 +表示;
  • 私有(private), 在类图中分别用符号 -表示;
  • 受保护(protected),在类图中分别用符号 表示;

    这个元素或这个方法对这个类及其子类的其他元素可见。
  • 包可见性,对同一个包中的其他元素可见,在类图中分别用符号 * 表示;

    Java用protected修饰类成员时,该成员可被其所属类的子类以及与其所属类处于同一包中的其他类所访问。

类图间的关系

一共九种关联关系,他们的符号可以记不住,这个没关系,用到再回来查。但是,他们各个图间的关系概念得分辨明晰,不要有含混不明的地方。

  1. 关联关系(有6种)

    • 1.1 双向关联

      • 默认情况下,关联是双向的;
      • 在UML种用一个根实线连接两个类表示。
    • 1.2 单向关联
      • 类的关联关系也可以是单向的,在UML中单向关联用带箭头的实线表示。
    • 1.3 自关联
      • 在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
    • 1.4 多重关联
      • 表示两个关联对象在数量上的对应关系;
      • 在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
    • 1.5 聚合关系(Aggregation)
      • 聚合关系表示整体与部分的关系;
      • 组合关系与聚合关系的区别在于生命周期的管理。在聚合关系中,整体对象和部分对象之间的关联是比较宽松的,部分对象可以独立存在而不受整体对象的控制。
      • 在UML中,聚合关系用带空心菱形的直线表示。
    • 1.6 组合关系(Composition)
      • 组合关系表示类之间整体和部分的关系;
      • 组合关系与聚合关系的区别在于生命周期的管理。在组合关系中,整体对象拥有和管理部分对象的全生命周期
      • 在UML中,组合关系用带实心菱形的直线表示;
  2. 依赖关系
    • 依赖(Dependency)关系是一种使用关系;
    • 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
    • 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
  3. 泛化关系
    • 泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系;
    • 在UML中,泛化关系用带空心三角形的直线来表示。
  4. 接口与实现关系
    • 在接口中,通常没有属性,而且所有的操作都是抽象的,只有操作的声明,没有操作的实现;
    • 接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现(Realization)关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作。
    • 在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。

双向关联

  • 双向关联类似 我拥有你,你也拥有我;
  • 在UML种用一个根实线连接两个类表示。

例如,顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系,如下图。

public class Customer {
private Product[] products;
} public class Product {
private Customer customer;
}

单向关联

  • 类的关联关系也可以是单向的,就类似 我拥有你,但你不能拥有我;
  • 在UML中单向关联用带箭头的实线表示。

public class Customer {
private Address address;
} public class Address {}

自关联

  • 这个也是单向关联,只是指向的不是别人,是自己。
  • 在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
  • 例如,一个节点类(Node)的成员又是节点Node类型的对象,

public class Node {
private Node node;
}

多重性关联

这个应该是最复杂的,需要好好看看;

  • 又称为重数性(Multiplicity)关联关系,表示两个关联对象数量上的对应关系
  • 多重性应用于关联的目标端,说明源类的每个实例与目标类实例的连接个数。除非显式说明,否则关系的多重性就是未指定的。
  • 在UML类图中,关系连线的两端有时会有1..1、*..1等符号,通过下图来做一个说明。

用一个数字或一个数字范围表示, 这里的数字范围一遍指符号,下面有说明表格。

符号说明:

例如:一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面,因此,一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联,如下图:

对应的Java代码:

public class Form {
private Button[] buttons; //定义一个集合对象
} public class Button {}

注意: 类之间的多重性有时会直接在关系连线上用一个数字表示,其实这种是不严谨的表示法,

多重性描述的是关系连线的两端,自然要将两端的范围都描述清楚,只写一个数字,会让人不清楚是头还是尾,引起混乱!

聚合关系

  • 是一种描述 整体与成员间的关系;
  • 在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在;
  • 简而言之,整体死去了,成员还活着
  • 在UML中,聚合关系用带空心菱形的直线表示。

在代码实现聚合关系时,成员对象通常作为构造方法Setter\Getter方法业务方法的参数注入到整体对象中,对应的Java代码片段如下:

public class Car {
private Engine engine; //构造注入
public Car(Engine engine) {
this.engine = engine;
} //设值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
} public class Engine {
// ...
}

组合关系

  • 是一种描述 整体与成员间的关系;
  • 在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系
  • 简而言之,整体死去了,成员也死了
  • 在UML中,组合关系用带实心菱形的直线表示;

例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系。

public class Head {
private Mouth mouth; public Head() {
this.mouth = new Mouth(); //实例化成员类
} } public class Mouth {
// ...
}

依赖关系案例

在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

对应的Java代码:

public class Driver {
public void drive(Car car){
car.move();
}
} public class Car {
public void move(){
// ...
}
}

泛化关系案例

在UML中,泛化关系用带空心三角形的直线来表示。

对应的Java代码:

//父类
public class Person (
protected String name;
protected int age; public void move( ) {
// ...
}
public void say( ) {
// ...
}
} //子类
public class Student extends Person {
private String teacherNo; public void study( ) {
// ...
}
} //子类
public class Teacher extends Person {
private String teacherNo; public void teach() {
// ...
}
}

接口与实现关系案例

在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。



对应的Java代码

public interface Vehicle {
public void move()
} public class Ship implements Vehicle {
public void move(){
// ...
}
} public class Car implements Vehicle {
public void move() {
// ...
}
}

Understanding UML in seconds的更多相关文章

  1. Game Development Patterns and Best Practices (John P. Doran / Matt Casanova 著)

    https://github.com/PacktPublishing/Game-Development-Patterns-and-Best-Practices https://github.com/m ...

  2. Linux 日志报错 xxx blocked for more than 120 seconds

    监控作业发现一台服务器(Red Hat Enterprise Linux Server release 5.7)从凌晨1:32开始,有一小段时间无法响应,数据库也连接不上,后面又正常了.早上检查了监听 ...

  3. I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题

    I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题 http://mssqlwiki.com/2012/08/ ...

  4. UML中关联(Association)、聚合(Aggregation)和合成(Composition)之间的区别

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 现在,我们需要设计一个项目管理系统,目前我们收集到了如下这些需求: REQ1:一个项目内有多名项目成 ...

  5. Understanding CMS GC Logs--转载

    原文地址:https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs Understanding CMS GC Logs By Po ...

  6. Understanding G1 GC Logs--转载

    原文地址:https://blogs.oracle.com/poonam/entry/understanding_g1_gc_logs Understanding G1 GC Logs By Poon ...

  7. (转)The 9 Deep Learning Papers You Need To Know About (Understanding CNNs Part 3)

    Adit Deshpande CS Undergrad at UCLA ('19) Blog About The 9 Deep Learning Papers You Need To Know Abo ...

  8. Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js

    [转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ...

  9. Understanding Convolution in Deep Learning

    Understanding Convolution in Deep Learning Convolution is probably the most important concept in dee ...

  10. The Guide To Understanding mysqlreport

    The Guide To Understanding mysqlreport This guide to understanding mysqlreport explains everything t ...

随机推荐

  1. 有管django使用orm 字段报错问题

    直接删除表,重新生成,首先删除:migrations 中,上传记录,然后django_migrations,

  2. 逍遥自在学C语言 | 揭开while循环的神秘面纱

    前言 循环是一种重要的控制结构,可以使程序重复执行一段代码,直到满足特定条件为止. 在C语言中,while和do-while是两种常用的循环结构,本文将详细介绍这两种循环的用法. 一.人物简介 第一位 ...

  3. docker安装LuaJIT WEB应用防火墙

    安装包请见 https://www.jianshu.com/p/b81656764613 Dockerfile #FROM ubuntu FROM centos MAINTAINER G00G1S C ...

  4. JUC同步锁原理源码解析四----Semaphore

    JUC同步锁原理源码解析四----Semaphore Semaphore 1.Semaphore的来源 A counting semaphore. Conceptually, a semaphore ...

  5. Tr0ll-1项目实战

    前言 Tr0ll的灵感来源于OSCP实验室内机器的不断拖动. 目标很简单,获取root并从/root目录中获取Proof.txt. 不适合那些容易受挫的人!公平的警告,前方有巨魔! 靶机环境 kali ...

  6. 在命令行按下tab键之后, 发生了生么?

    1. 引言 2. complete命令 3. 自定义补全列表 4. 动态补全列表 5. compgen命令 6. 别名的自动补全 7. 补全规则永久生效 8. 自动加载 9. 参考 1. 引言 当我们 ...

  7. sql server注入rce实践

    背景:在漏洞挖掘中,合理的利用sql注入,可以把注入转换成rce,使一个高危漏洞变成严重漏洞.在红蓝对抗中,利用注入rce,实现内网横向移动.笔者基于漏洞挖掘和红蓝对抗上遇到的sql server注入 ...

  8. 从2PC和容错共识算法讨论zookeeper中的Create请求

    最近在读<数据密集型应用系统设计>,其中谈到了zookeeper对容错共识算法的应用.这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以 ...

  9. 将onnx的静态batch改为动态batch及修改输入输出层的名称

    目录 背景 操作 修改输入输出层 修改输入输出层名称 完整代码 背景 在模型的部署中,为了高效利用硬件算力,常常会需要将多个输入组成一个batch同时输入网络进行推理,这个batch的大小根据系统的负 ...

  10. Spring MVC 前后台传递json格式数据 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    若使用默认的json转换器,则需要如下包: <mvc:annotation-driven /> 报错如下: Content type 'application/x-www-form-url ...