「设计模式」10分钟学懂UML类图

createh53周前 (03-24)技术教程10

UML介绍

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

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

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

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

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

类的UML类图表示

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

  • o 第一层:类名
  • o 第二层:成员变量
  • o 第三层:成员方法

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

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

class Student{
    public String pubVar;
    protected String proVar;
    private String priVar;
    String defaultVar;

    public String pubFun(){
        return "pubFun";
    }
    protected String proFun(){
        return "proFun";
    }
    private String priFun()
    {
        return "priFun";
    }
    String defaultFun(){
        return "defaultFun";
    }
}

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

抽象类的UML类图表示

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

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

abstract class Person{
    public String pubVar;
    protected String proVar;
    private String priVar;
    String defaultVar;

    public String pubFun(){
        return "pubFun";
    }
    protected String proFun(){
        return "proFun";
    }
    private String priFun()
    {
        return "priFun";
    }
    String defaultFun(){
        return "defaultFun";
    }
    //抽象方法
    public 
abstract
 void abstractFun();
}

其对应的UML类图如下:

接口的UML类图表示

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

下面是一个接口的定义:

interface
 Shoes{
    void abstractFun();
}

其对应的UML类图如下:

包的UML类图表示

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

package graph;

UML类图表示类之间关系

继承关系

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

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

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

class Parent{

}

class Son 
extends
 Parent{

}

用UML类图表示如下:

实现关系

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

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

interface
 Animal{

}

class Dog 
implements
 Animal{

}

用UML类图表示如下:

聚合关系

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

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

如下所示

class Department{
    private 
Employee employee
;
}

class Employee{

}

其对应的UML类图如下:

组合关系

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

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

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

class Mouth
{

}

class Head {
    private Mouth mouth;
}

其UML类图表示如下:

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

依赖关系

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

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

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

java代码:

class Screwdriver{

}

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

    }
}

对应的UML类图表示如下:

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

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

相关文章

java泛型核心原理和使用

1. 核心原理类型参数化 泛型允许我们在定义类、接口或方法时指定一个或多个类型参数。例如:public class Box { private T element; public v...

Java 7新特性深度解析:提升效率与功能

一、Switch中添加对String类型的支持Switch语句可以使用原始类型或枚举类型。Java引入了另一种类型,可以在switch语句中使用:字符串类型。public class switchAd...

Java面向对象编程:从继承困惑到多态应用的实战解析

Java面向对象编程:从继承困惑到多态应用的实战解析引言部分作为Java开发者,你是否曾在复杂继承结构中迷失?抽象类与接口的选择让你举棋不定?多态应用时方法重写与重载的区别始终模糊不清?这些问题不仅困...

【二】设计模式~创建型模式~工厂方法模式(Java)

【学习难度:★★☆☆☆,使用频率:★★★★★】2.1. 模式动机现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽...

婚前曾经拒绝过我的女神,把我约到了酒店

我站在万豪酒店旋转门前,看着玻璃上并排倒映着两件白衬衫——一件是刚拆封的婚礼正装,另一件是七年前被咖啡渍染黄的旧衫。手机屏幕上的"1702"房号像串倒计时代码,在暮春的阳光下泛着冷光。十七点零二分,电...

程序员腾讯面试,却倒在警察抓小偷逻辑题上 网友:我也倒在这里

现在,程序员可是个高薪职位,许多程序员月薪都破万了,乃至表中的领头羊也可以达到年薪百万,但是实际的薪资待遇还是要看你的技术能力。近日,一程序员发帖子调侃道,我1个两年经验的码农竟然败在第二次腾讯面试,...