十分钟掌握 “UML ” 的基本使用


每博一文案

很喜欢这样一段话:内可以不跟别人计较,但一定要学会维护自己,你可以不跟别人争抢,但应该懂得远离小人。
人生在世,我们会遇到形形色色的人,人心隔肚皮,不是所有人都带着真心,有的人当面对你好,却在背地里抹黑你,
有些话你说了,人家当成笑话听听,有些是你讲了,别人在背后议论纷纷,时间总会戳穿谎言给我们答案,让我们明白
谁是真的惦记,谁是虚情假意。有些事我不说,不代表我不知道,有些话我不说,不代表我不在乎,只是不想说出来,
把关系搞得太僵,谁真心对我好,谁假情假意,敷衍我看在眼里,记在心里,你真心对我好,我也会不计代价对你好。
你若只是利用我,那我的善良也是有底线,不会任由你欺骗,谁是真朋友,谁是为了利益,我心里明白,看一个人是否真心,
不能只看他嘴上说的,而要看他实际上做的,人与人相处,谁都不傻,你能欺骗的都是信任你的人,你能伤害到的都是在乎你的人,
不要把别人对你的好当作理所应当。不要把别人的退让当成你的权利,没有谁一定对谁好,你对我好,我才会对你好,
这一路走来,吃过许多亏,受过很多委屈,我不愿多说,我只想这个苍茫的世界,过好自己的生活。
愿我们都将心比心,对人真心,人生路上一同走。——————   一禅心灵庙语

文章目录

  • 十分钟掌握 “UML ” 的基本使用
    • 每博一文案
    • 1. 初始 UML 图
    • 2. 类图
      • 2.1 类图中类的表示方式
        • 2.1.1 类的属性的表示方式
        • 2.1.2 类的方法的表示方式
      • 2.2 类与类之间关系的表示方式
        • 2.2.1 泛化关系(is a)
        • 2.2.2 实现关系(like a)
        • 2.2.3 关联关系 (has a)
          • 2.2.3.1 单向关联
          • 2.2.3.2 双向关联
          • 2.2.3.3 自关联
        • 2.4 聚合关系
        • 2.5 组合关系
        • 2.6 依赖关系
    • 3. 用例图
    • 4. 时序图
    • 5. 总结:
    • 6. 最后:

1. 初始 UML 图

平时阅读一些远吗? 分析类文章或是设计应用架构时没少与UML类图打交道。

程序员将来要根据 UML 设计图进行编程 / 开发 ,所以对于 UML 的认识,还是十分有必要的。

画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理。

下面赶紧来一起认识一下它吧!!!

统一建模语言(Unified Modeling Language,UML) 是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。

UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系。

UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作 图、构件图、部署图等 9 种图。

使用UML来建模,常用的工具有 Rational Rose , IBM Rational Rose,StarUML,MS Visio

2. 类图

类图(Class Diagram) 是显示了模型的静态结构。主要是描述:类的信息(包括属性,方法)以及类和类之间的关系的信息

类图的作用:

在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解;类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。

2.1 类图中类的表示方式

2.1.1 类的属性的表示方式

UML 类图中,类使用包含类名属性方法 且带有分割线的矩形来表示,比如下图表示一个 Employee 类,它包含了 name,age,email 这 3 个属性,以及一个 work() 方法,两个构造器(构造方法) Employee( )

对于 UML 中类的属性的编写格式如下:

- name : String
属性的可见性 属性名 : 属性的数据类型
// 需要注意的一点就是: 与Java中不同的是: 定义属性时,属性名是在右边,数据类型在左边,而UML类图是属性名在左边,数据类型在右边和 MySQL创建表结构定义字段一样,属性名先写在左边,后面是该属性的数据类型
同样也是可以赋默认初始值的如下
+ num : int = 10

其中在属性/ 方法名称前加的 "-""+" 以及 "#" 是什么意思呢 ? 它们表示了 这个属性或者方法的可见性 ,换句话说就是 “权限”,UML 类图中表示可见性的符合有 三 种,如下:

  • + : 表示 public
  • - :表示 private
  • # :表示 protected

因此,上图中的Employee类具有3个私有属性和一个公有方法。

根据上图是 UML 编写的类结构:

public class Employee {private String name;private int age;private String email;public Employee() {}public Employee(String name,int age,String email) {}public void work() {}
}

2.1.2 类的方法的表示方式

上图中我们已经看到了方法的表示形式。实际上,方法的完整表示方式如下:

+ work(String name, int age) : void
方法的可见性 方法名(参数列表) : 返回类型
// 注意方法名和类名相同并带有下划线的方法:表示的是该类的构造器

注意方法名和类名相同并带有下划线的方法:表示的是该类的构造器

举例 在下图的Demo类中,定义了4 个方法


上图Demo类定义了 四个方法:

  • Demo( ) 该方法 与类名一致同时带有下划线,修饰符为: public ,表示的是该类的构造器
  • method() 方法:修饰符为 public ,没有参数,没有返回值的方法。
  • method1() 方法:修饰符为 public ,接收一个参数类型为 String ,返回值类型为 String
  • method2() 方法:修饰符为 private,接收一个参数类型为 Object ,返回值类型为 String
  • method3() 方法:修饰符为 protected,接收两个参数,第一个参数的类型为 int ,第二个参数类型为 String ,返回值类型为 int

根据如上 UML图设计类具体代码如下:

public class Demo {public Demo() {}public void method() {}public String method1(String str) {return "String";}public String method2(Object object) {return "Object";}public int method3(int num,String str) {return 0;}
}

2.2 类与类之间关系的表示方式

我们知道 类图 主要描述的是: 系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。

类与类之间的关系主要包括 6 关系: 泛化(继承)关系,实现关系,关联关系,聚合关系,组合关系。

2.2.1 泛化关系(is a)

泛化关系实际上就是 继承关系 ,继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,可以是 类之间的 父类与子类之间的继承关系,也可以是 接口 与 接口 之间的 继承关系,而接口之间是可以多继承的。

UML 类图种,泛化(继承) 关系用带 空心三角箭头的实线来表示,箭头从子类指向父类,在代码实现时,使用面对对象的继承机制来实现泛化关系。

在 UML 中 纯虚线 所对应的 书签页 表示 注释 如下:

在 UML 图中 双引号表示 注释 如下:

举例: 下图所示中,Bird(鸟)类与 Dog(狗) 类继承了Animal(动物)类

上图 UML 对应的 Java 代码

public class Animal {protected String name;protected int age;public void tweet() {System.out.println("鸣叫");}}class Bird extends Animal{public void fly(){System.out.println("翱翔");}
}class Dog extends Animal{public void run(){System.out.println("奔跑");}
}

接口之间的多继承关系

举例: 如下 Beijing(北京)继承了 Globe(地球) 和 China(中国) 这两个接口

其中的 UML 图 java 代码实现如下:


public interface Globe {}interface China{}interface Beijing extends China,Globe{}

2.2.2 实现关系(like a)

实现关系:就是接口实现类之间的关系。这种关系对应 implement 关键字,类实现了接口,实现类必须重写 接口中所声明的所有抽象方法不然编译无法通过的。

在 UML 类图中,实现关系使用 带空心三角箭头的虚线 来表示,箭头从实现类指向接口

例如: 如下图中,Car(汽车)类与Ship(船)类都实现了 Vehicle (交通工具)接口。

其中的 UML 类图的 Java代码实现如下:


public interface Vehicle {public static final int num = 10;public abstract void method();
}class Ship implements Vehicle{// 重写接口中的抽象方法@Overridepublic void method() {}
}class Car implements Vehicle{// 重写接口中的抽象方法@Overridepublic void method(){}
}

2.2.3 关联关系 (has a)

关联关系: 是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如 程序员和电脑,人和身份证等。关联关系是类与类之间最常用的一种关系。关联关系又可进一步分为单向关联、双向关联和自关联。

关联具有多重性: 如 :“1” 表示有且仅有一个,“0” 表示 0个或者多个,“n…m” 表示 n 到 m 个都可以,表示至少 m 个

2.2.3.1 单向关联

在UML 当中一个 带箭头的直线 表示 一个单向的关联关系,箭头的下方的数值表示对应关系(一对一,一对多),箭头的上方的文字表示对应的类所处的角色(注意这个角色名很重要,因为在不同的地方定义不同的类类型的属性,所充当的角色是不一样的)。其中箭头的起始位置表示该类定义属性引用另外一个类的,箭头指向对应属性类。如下图:

举例: 每一个中国人对应一个身份证,这通过让中国人 Person 类持有一个类型为IdentityID 身份证的成员变量类实现。

其中 UML 的Java代码实现:


public class Person {public IdentityID ID;public void study(){}
}class IdentityID{}
2.2.3.2 双向关联

双向关联: 所谓的双向关联就是双方各自持有对方类型的成员变量。双方都可以找到对方,比如:一个客户可以购买多个商品,我们可以通过客户的信息找到其所购买的商品,反过来我们也可以这个商品找到其被哪个客户所购买了。

在 UML 类图中,双向关联用一个不带箭头的直线 表示,同样的直线下面表示(对应的关系(是一对一,还是 n 对 m )),上面表示对应的角色(重要,因为不同的位置所充当的角色是不同的,比如这个类在另外一个类中所充当的角色可能就不同了)。如下图所示:

举例:如下图中 Customer (顾客)类中维护一个 commoditys(商品)[] 类的数组,表示一个顾客购买了的商品;在Commodity(商品)类中维护一个 Customer (顾客)类型的成员变量,表示这个商品被哪个顾客所购买了。

具体的Java代码实现如下:


public class Customer {private Commodity[] commoditys;
}class Commodity{private Customer customer;
}
2.2.3.3 自关联

自关联:就是自己包含自己的成员属性。

在UML 类图中用 一个带有箭头且指向自身的直线 表示。

举例: 定义一个 Person 类 ,其中 Person 类包含类型为 Person 的自己的成员变量。

具体Java代码实现:


public class Person {private String name;private Person person;public void method(){System.out.println("自关联");}
}

2.4 聚合关系

聚合关系是关联关系的一种,是整体和部分之间的关系,整体与部分可以分开,所以整体的生命周期不会决定部分的生命周期

聚合关系是关联关系的特例,聚合关系也是通过成员对象来实现的,其中成员是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。例如:学校与老师的关系,学校中包含了老师,但是如果学校停办了,老师依然存在。而反过来,老师没有了,学校也依然存在。

在 UML 类图中,聚合关系使用 带空心菱形的实线 来表示,菱形指向整体,其中直线的下面表示(对应关系:一对一,一对 n),直线上面表示对应的角色。如下图所示:

举例: 教室包含了学生,学生脱离了教室也能单独存在。

具体的Java代码实现:


import java.util.List;public class ClassRoom {private List<Student> students;public ClassRoom(List list) {this.students = list;}public List<Student> getStudents() {return students;}
}class Student{public String name;public Student(){System.out.println("无参构造器");}
}

2.5 组合关系

组合关系:可以看做是一种特殊的聚合关系,特殊在哪里呢:特殊在:组合关系中,整体对象可以控制部分对象的生命周期,部分是依附在整体上面的,整体和部分存在一个级联删除 : 一旦整体对象不存在了,部分对象也将不存在,而部分对象离开了整体对象是 “无法存活的”。即整体和部分是不可分开的 。例如:头和嘴的关系,没有了头,嘴也就不存在了,而嘴也是不能离开头单独存在。

在 UML 类图中,组合关系用带实心菱形的实线 来表示,菱形指向整体 ,实线的下面表示(对应关系:一对一,一对多),实线上面表示(所充当的角色)。如下图:

在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体。下图所示是头和嘴的关系图:

具体Java代码实现:


public class Head {// 注意了:因为是组合关系:所以定义的是实例对象出来的,即当 Head 被销毁了 Mouth 也是跟着被销毁的private Mouth mouth = new Mouth();public void reflect(){System.out.println("思考");}
}class Mouth{public void eat() {System.out.println("吃");}
}

2.6 依赖关系

依赖关系是一种使用关系,是所有关系中耦合度最弱的一种关联方式,是临时性的关联。这种关系在代码中通常体现在:某个类中的方法的局部变量,方法中参数列表,方法的返回类型,或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

在 UML 类图中,依赖关系使用 带箭头的虚线 来表示,箭头从使用类指向被依赖的类。如下图:

举例: 下图所示是 司机 和汽车的 UML 图,司机驾驶汽车,作为方法中的参数使用。

具体的Java代码实现

package com.RainbowSea.Blogs.UML;public class Driver {private String name;public void drive(Car car) {car.move();}}class Car{public void move() {System.out.println("开车移动");}}

举例: 司机 和汽车的 UML 图,司机驾驶汽车,作为方法中的局部变量,和返回值类型使用

具体Java代码实现如下:

package com.RainbowSea.Blogs.UML;public class Driver {private String name;public Car use( ) {Car car = new Car();car.move();return car;}}class Car{public void move() {System.out.println("开车移动");}}

3. 用例图

用例图(use case diagram) : 是站在 系统用户(系统角色) 的角度分析系统存在哪些功能 ? 实现用例图的时候,需要先进行系统角色的抽取,在 Raitional Rose 工具当中一般会在 Use Case View 当中实现用例图:

如下是 学生信息管理系统用例图

如下是 书店管理系统用例图

如下是一个普通的系统管理员用例图

4. 时序图

时序图 (sequence diagram) : 时序图当中描述了方法的调用过程,程序的执行流程,以及方法执行结束的返回值情况。

时序图,也叫序列图,顺序图,是 UML 中常用的动态视图,用于描述多个对象参与实现业务目标时,彼此之间按时间顺序进行交互的过程。

时序图:用来表达对象或角色之间交互的信息传递和时间顺序,特别方便。

每次梳理流程,跟开发沟通,都可以借助它来描述。

绘制时序图,将一个个对象和其它交互动作列出来,可以直观反映出,每个对象其他对象,或其自身做的交互动作。

让我们看到业务内部的运作,系统之间的互动,从而搞清楚业务规则,系统逻辑

时序图的构成

时序图的常用元素很简单,分别有:对象(角色)、生命线、会话、消息(简单消息、返回消息)。

如下是:客户用 ATM 取款的时序图

如下是一个登录的时序图:


一般用例图当中一个用例会对应时序图当中一个时序图图,时序图描述的是一个功能具体是怎么实现的,流程是什么 ???

如下是一个简单的 请求 与响应 的时序图:

小人:动作事件的触发者

矩形/小圆圈:对象

实线箭头:调用

虚线箭头:返回

柱状:对象的生命周期,柱状不能断,在同一个流程当中不能断。

回折线:当前类的方法执行过程中调用自己当前类中的其它方法

理解 时序图 的编写代码:

如下时序图:

根据上图编写的Java代码如下:


public class A {public void xxx(){B b = new B();b.method1();}}class B {public void method1(){C c = new C();c.method2();this.method4();}public void method4(){System.out.println("B:method4");}
}class C{public void method2(){this.method3();}public void method3(){System.out.println("C:method3");}}

5. 总结:

UML 类图的关系线条

  1. 重点:理解并使用 UML 的类图就可以了,基本现阶段我们Java程序员主要学习的还是 UML的类图。
  2. 关于UML 类图中,表示类中的属性和方法的绘制
  3. UML 类图中:类之间的六种关系:泛化(继承关系),实现关系,关联关系,聚合关系,组合关系,依赖关系
  4. 泛化关系:类与类之间的单继承关系,接口 与 接口之间的多继承关系
  5. 实现关系:实现类与接口之间的关系。
  6. 关联关系:单向关联,双向关联,自关联。
  7. 聚合关系:整体与局部可以分开:学校与老师之间的关系。
  8. 组合关系:整体与局部不可以分开:头 与 嘴的关系。
  9. 依赖关系:一个类中对另外一个类的使用:类中的方法的局部变量,方法中的返回值类型,方法中的参数,方法中调用对应类中的方法。是耦合度最弱的关系。
  10. 用例图:描述系统用户角色对应功能的介绍。详细了解:大家可以移步至:

    十分钟掌握 “UML ” 的基本使用相关推荐

    1. 十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数

      2019独角兽企业重金招聘Python工程师标准>>> 这是十分钟成为 TiDB Contributor 系列的第二篇文章,让大家可以无门槛参与大型开源项目,感谢社区为 TiDB 带 ...

    2. 用D3.js 十分钟实现字符跳动效果

      用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子 原文分为三部分, 在这里笔者将其整合为了一篇方便阅读. 该效果基于 D3.js, 主要使用到了 ...

    3. 飞机的“黑色十分钟”能被人工智能消灭吗?

      [导读]近年来,"AI的应用和落地"逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的"化学反应".例如,在日常生活中,AI可以推送我们喜欢的新 ...

    4. 十分钟上手2022latex安装与入门

      序言:本次下载是为美赛而用,因此我们选择的下载组合为texlive+texstudio,使用windows10安装.在此提醒大家,类似工具的下载建议大家亲历亲为,不要相信一些诱导性网站,都是非官方的安 ...

    5. 十分钟用Windows服务器简单搭建DHCP中继代理!!

                           十分钟用Windows服务器简单搭建DHCP中继代理!! 一.什么是中继代理? 大家都知道DHCP分配地址都需要用到IP广播,但是广播是不能在两个网段之间进行 ...

    6. 《科学》:媲美AlphaFold2的蛋白质结构预测新工具问世,一台游戏计算机十分钟出结果,完全免费...

      来源:学术头条本文约2000字,建议阅读5分钟 整个研究学界都将受益. 如今,人工智能已经渗透到人们生活的方方面面,各种深度学习算法也越来越多地应用于各个领域.尤其在生物和医学领域,人工智能技术可以说 ...

    7. 十分钟了解分布式计算:GraphX

      GraphX原型论文 GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collabora ...

    8. 10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析...

      场景描述 共享电动车企业使用函数服务搭建服务端.在函数服务中开启日志,把程序日志写到日志服务,同时在函数代码中使用SDK把运营日志写入到日志服务,使用日志服务进行日志分析. 在日志服务中,用户可以: ...

    9. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

      原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

    最新文章

    1. sparkCore源码解析之思维脑图
    2. BZOJ 1047 理想的正方形(单调队列)
    3. 关闭oracle自动统计,禁用Oracle 11g的统计数据自动收集功能
    4. sdut 2129树结构练习——判断给定森林中有多少棵树(并查集)
    5. 设计模式 过滤器模式
    6. 串行舵机/数字舵机的替代方案,低成本的舵机级联方案。数字舵机的驱动芯片。普通舵机改数字舵机
    7. 电脑配置Java环境变量之后,在cmd中仍然无法识别
    8. Atitit.http代理的实现 代码java php c# python
    9. 一文读懂矩阵的特征分解
    10. 16台服务器达成1000万tpmC!挑战分布式数据库性能极限
    11. mac电脑谷歌浏览器全屏显示选项卡
    12. JAVA:Array List和Linked List
    13. HTML(第九章) 标签: 网页动画
    14. 《企业管理学》—战略管理与目标管理知识点总结
    15. 16、TFT-LCD 1.8寸显示屏使用
    16. specular图使用方法_次世代贴图教程_SPECULAR、SPECULAR POWER原理教程
    17. class文件加密和解密
    18. 消息栏通知(Notification)介绍
    19. shell 编程空格注意事项
    20. 导致word文档损坏故障发生的原因是什么?

    热门文章

    1. 微信自动检测色情图片_python +itchat
    2. 【python教程入门学习】Python黑科技:WiFi破解
    3. Decision Transformer环境安装
    4. win10如何新增ip地址
    5. 【Python】 将图片绘制到Excel表格中
    6. c语言打印三角99乘法表,用c语言打印99乘法表4种三角形
    7. OmniPeek-20180725-Error 2502/Error 2053
    8. afterlogic webmail lite php,windows内网邮件服务器搭建(hMailserver+ AfterLogic WebMail Lite)
    9. 2021高博会扩大举办,助力高尔夫运动新发展
    10. 尤雨溪:Vue3.0 官宣彻底抛弃 IE 浏览器