十分钟掌握 “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{
// 重写接口中的抽象方法
@Override
public void method() {
}
}
class Car implements Vehicle{
// 重写接口中的抽象方法
@Override
public 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 类图的关系线条
- 重点:理解并使用 UML 的类图就可以了,基本现阶段我们Java程序员主要学习的还是 UML的类图。
- 关于UML 类图中,表示类中的属性和方法的绘制
- UML 类图中:类之间的六种关系:泛化(继承关系),实现关系,关联关系,聚合关系,组合关系,依赖关系
- 泛化关系:类与类之间的单继承关系,接口 与 接口之间的多继承关系
- 实现关系:实现类与接口之间的关系。
- 关联关系:单向关联,双向关联,自关联。
- 聚合关系:整体与局部可以分开:学校与老师之间的关系。
- 组合关系:整体与局部不可以分开:头 与 嘴的关系。
- 依赖关系:一个类中对另外一个类的使用:类中的方法的局部变量,方法中的返回值类型,方法中的参数,方法中调用对应类中的方法。是耦合度最弱的关系。
- 用例图:描述系统用户角色对应功能的介绍。详细了解:大家可以移步至:🔜🔜🔜 http://www.uml.org.cn/modeler/202002112.asp
- 时序图:用例图中某种功能上具体实现流程(方法之间的调用,返回,请求 与 响应),详细介绍:大家可以移步至:🔜🔜🔜https://mikechen.cc/19673.html
6. 最后:
限于自身的水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期!!!