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

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

在这里插入图片描述


每博一文案

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


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 类图的关系线条

在这里插入图片描述

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

6. 最后:

限于自身的水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值