• 【设计模式】10分钟学懂UML类图


    UML介绍

    自己刚刚参加工作时,刚进部门第一周leader让我熟悉一个模块的调用过程,那个模块包含几十个类、有上百个方法,类和类之间关系错综复杂,各种方法调来调去,我就画了一整张纸,密密麻麻,睡醒觉第二天就已经看不懂了,简直裂开,这种感觉记忆尤新,当时leader说”工具不对“,然后从那个时候才开始接触UML。

    UML(Unified Modeling Language)是一种统一建模语言,是用来对软件密集系统进行可视化建模的一种语言。

    UML图有很多种,主要包含以下几类:

    但是对于初学者来说,我们不需要掌握所有的UML图,才能进行系统分析和设计工作,否则学习的成本太高了。根据二八原则,一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成80%的工作了。而对于程序员来说,使用最频繁的又是类图。因此,本文我们只介绍UML类图

    抽象类、抽象类、接口和包的UML类图表示

    类的UML类图表示

    UML类图中用矩形框表示一个具体类,矩形框分为三层:

    • • 第一层:类名

    • • 第二层:成员变量

    • • 第三层:成员方法

    成员变量以及成员方法名前的访问修饰符用对应符号来表示,成员变量以及成员方法名后紧跟着":"后面再跟着成员变量的类型或者方法的返回类型,举个例子。

    下面是一个具体类的定义:

    1. class Student{
    2.     public String pubVar;
    3.     protected String proVar;
    4.     private String priVar;
    5.     String defaultVar;
    6.     public String pubFun(){
    7.         return "pubFun";
    8.     }
    9.     protected String proFun(){
    10.         return "proFun";
    11.     }
    12.     private String priFun()
    13.     {
    14.         return "priFun";
    15.     }
    16.     String defaultFun(){
    17.         return "defaultFun";
    18.     }
    19. }

    下面是该类对应的UML类图:

    抽象类的UML类图表示

    抽象类在UML类图中同样用矩形框表示,不同的是抽象类的类名以及抽象方法的名字都用斜体字表示,其它和具体类没有任何差别。

    下面是一个抽象类的定义:

    abstract
    1.  class Person{
    2.     public String pubVar;
    3.     protected String proVar;
    4.     private String priVar;
    5.     String defaultVar;
    6.     public String pubFun(){
    7.         return "pubFun";
    8.     }
    9.     protected String proFun(){
    10.         return "proFun";
    11.     }
    12.     private String priFun()
    13.     {
    14.         return "priFun";
    15.     }
    16.     String defaultFun(){
    17.         return "defaultFun";
    18.     }
    19.     //抽象方法
    20.     public 
    abstract
    1.  void abstractFun();
    2. }

    其对应的UML类图如下:

    接口的UML类图表示

    接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端会用 <>标注这是一个接口,下面是接口的名字,第二层是方法。另外需要注意的是接口的方法前面没有访问修饰符默认就是public访问权限。

    下面是一个接口的定义:

    interface
    1.  Shoes{
    2.     void abstractFun();
    3. }

    其对应的UML类图如下:

    包的UML类图表示

    类和接口一般都出现在包中,UML类图中包的表示形式如图:

    package graph;

    UML类图表示类之间关系

    继承关系

    继承关系也称为泛化关系,是指对象与对象之间的继承关系。如,

    在UML类图中,继承关系是用空心三角和实线组成的箭头表示,从子类指向父类。

    下面的例子中,Son类继承了Parent类。

    1. class Parent{
    2. }
    3. class Son 
    extends
    1.  Parent{
    2. }

    用UML类图表示如下:

    实现关系

    实现关系是指接口及其实现类之间的关系。在UML类图中,实现关系用空心三角和虚线组成的箭头来表示,从实现类指向接口,

    下面的例子中,Dog类实现了了Animal类。

    interface
    1.  Animal{
    2. }
    3. class Dog 
    implements
    1.  Animal{
    2. }

    用UML类图表示如下:

    聚合关系

    聚合关系是一种特殊的关联关系,表示的是整体和部分的关系,整体与部分具有各自的生命周期,即使整体没有了,部分还能存在,典型的例子就是,公司部门与员工的关系,一个部门撤消了,员工还能存在。

    在UML图中,聚合关系用空心菱形加实线箭头表示,空心菱形在整体一方,箭头指向部分一方。

    如下所示

    1. class Department{
    2.     private 
    Employee employee
    1. ;
    2. }
    3. class Employee{
    4. }

    其对应的UML类图如下:

    组合关系

    和聚合关系类似,组合关系表示的也是整体与部分的关系,但不同于聚合关系的是:组合关系中,整体与部分不可以分开,一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。

    组合关系和聚合关系不关概念很像,它们的UML类图表示也很像,在UML图中,组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方。

    举个例子,比如人的头(Head)和嘴巴(Mouth),嘴巴是头的组成部分之一,一旦头没了,嘴巴也没了,因此头和嘴巴是组合关系,对应的java代码如下:

    1. class Mouth
    2. {
    3. }
    4. class Head {
    5.     private Mouth mouth;
    6. }

    其UML类图表示如下:

    在Java代码形式上,聚合和组合关系中的部分对象是整体对象的一个成员变量,仅从类代码本身是区分不了聚合和组合的。如果一定要区分,那么需要结合业务角度上来看,如果作为整体的对象必须要部分对象的参与,才能完成自己的职责,那么二者之间就是组合关系,否则就是聚合关系。

    依赖关系

    依赖(Dependency)关系是一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。如:工人(Worker)要去拧螺丝,要依赖螺丝刀(Screwdriver)来帮助你完成拧螺丝的工作

    依赖关系在Java中的具体代码表现形式为B为A的构造器或方法中的局部变量、方法或构造器的参数、方法的返回值,或者A调用B的静态方法。

    在UML类图中,依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,可以看下面的例子。

    java代码:

    1. class Screwdriver{
    2. }
    3. class Worker{
    4.     //Screwdriver对象作为Worker类方法的参数,构成依赖关系
    5.     public void screw(
    Screwdriver screwdriver
    1. ){
    2.     }
    3. }

    对应的UML类图表示如下:

    经过上面的介绍,相信大家对UML类图已经有比较好的理解了,最后给大家介绍一个可以免费画UML类图的在线工具:https://www.processon.com/,本文的所有例子都是在这上面画的。

    最后,在网上找到一张对于类图比较综合的例子(如有侵权,请联系我删除),它将我们前面介绍的内容都联系起来,如下图所示,大家可以对照着理解图中各个类之间的关系:

  • 相关阅读:
    Spring Security(3)
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-ChapterA-bash 命令快速指南
    JS的优化技巧
    VUE开发记录
    Linux 内存之vmstat
    Linux:文件IO
    win10 环境下Python 3.8按装fastapi paddlepaddle 进行图片文字识别1
    电子管晶体管示波器电路图
    【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
    基于SSM框架的共享单车管理系统小程序系统的设计和实现
  • 原文地址:https://blog.csdn.net/hebiwen95/article/details/126103789