前言

一个合格的程序员,要想成长为一个高级工程师,不仅仅需要大量代码的编写,更需要对设计模式具有深入的了解和灵活的应用。从本篇文章开始,我将通过对【尚硅谷设计模式】视频课程的学习总结,尝试以最简单,最通俗易懂的方式完成对设计模式的讲解。

学习设计模式必不可少的一项能力就是能读懂UML类图,能够将自己的设计思路绘制成UML类图便于相互交流,其实稍有经验的程序员应该对UML类图都不陌生,因为我们平常会使用很多二次开发包,一般二次开发包都会提供一份包含本开发包的所有类相关的UML类图,通过UML类图可以让程序员快速的了解开发包中各个类的功能以及各个类之间的关系。

因为后面设计模式,都离不开UML类图进行解释说明,为避免有些博友对UML类图不是很清楚,本文详细讲解和梳理UML类图,并介绍通过为IDEA安装PlantUML Intergration插件实现UML类图的绘制,为后续设计模式的讲解做铺垫。本文所有代码都是以JAVA语言为例

一、UML类图简介

统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。简单来说UML就是通过一系列规定好的符号,将复杂的文字表述转为清晰明了的符号关系图。

UML图分为三大类:

  1. 用例图
  2. 静态结构图:类图,对象图,包图,组件图,部署图
  3. 动态行为图:交互图(时序图与协作图),状态图,活动图

对于软件开发来说,最常用的就是UML类图,类图通过一系列规定好的符号对类与类之间的关系进行描述。

类图中类与类之间主要包括六大关系,描述这些关系的符号如下图所示。
在这里插入图片描述

二、类之间的六大关系及UML类图

1、依赖关系及UML类图表示

只要一个类用到了其它类,那这个类和其它类就构成了依赖关系。如A类中用到了B,C,D类,则A类就依赖于B,C,D类。

那么一个类如何算用到了其它类?有以下几种情况:

  1. 其它类作为该类的成员属性,这种情况下,如A类用到了B类的代码示例。
class A{
    private B b;
}
  1. 其它类作为该类中方法的接收参数类型,这种情况下,如A类用到了B类的代码示例。
class A{
    public void test(B b)
    {
        //...
    }
}
  1. 其它类作为该类中方法的返回参数类型,这种情况下,如A类用到了B类的代码示例。
class A{
    public B test()
    {
        //...
        return null;
    }
}
  1. 其它类在该类的方法中使用到,这种情况下,如A类用到了B类的代码示例。
class A{
    public void test()
    {
        B b;
        System.out.println(b.toString());
    }
}

以上四种情况,都称作A类依赖于B类,UML类图中依赖关系由虚线加实心箭头表示,由依赖方指向被依赖方,A类依赖于B类的UML类图表示如下:
在这里插入图片描述

2、泛化关系及UML类图表示

泛化关系就是继承关系,它是继承关系的特例。如A类与B类之间是泛化关系,B类继承于A类,示例代码如下:

class B
{
    
}

class A extends B
{
    
}

泛化关系也就是继承关系,在UML类图中由实线加空心箭头表示,由继承方指向被继承方,如A类继承自B类的UML类图表示如下:
在这里插入图片描述

3、实现关系及UML类图表示

实现关系就是指一个类对另一个接口的实现,它也是依赖关系的特例。如A类与B接口直接是实现关系,A类实现B接口的代码示例如下:

class A implements B
{

}

interface B
{

}

实现关系在UML类图中由虚线加空心箭头表示,由实现方指向接口方,如A类实现B接口的UML类图表示如下:
在这里插入图片描述

4、关联关系及UML类图表示

关联关系是指类与类之间的联系,它也是依赖关系的特例。类与类之间的关联关系包括如下几种情况:

  1. 一对一,如一个人(Person)只能对应一个身份证(IDCard),而一个身份证只能对应一个人,代码示例如下:
class Person
{
    private IDCard idCard;//一个人对应一个身份证
}
class IDCard
{
    private Person person;//一个身份证对应一个人
}

关联关系在UML类图中是由实线加实心箭头表示,该案例在UML类图中的表达如下所示:
在这里插入图片描述

  1. 一对多,如一个教室(Classroom)可以包含多个学生(Student),代码示例如下:
class Classroom{
    List<Student> students;//一个教室可以包含多个学生
}

class Student
{
    
}

该案例在UML类图中的表达如下所示:
在这里插入图片描述
3. 多对多,如一个老师(Teacher)可以教多个学生(Student),而一个学生也可以有多个老师,示例代码如下:

class Teacher{
    private List<Student> students;//一个老师教多个学生
}

class Student
{
    private List<Teacher> teachers;//一个学生有多个老师
}

该案例在UML类图中的表达如下所示:
在这里插入图片描述

5、聚合关系及UML类图表示

聚合关系表示的是整体与部分的关系但整体与部分可以分开,整体没了,部分还存在它是关联关系的特例聚合关系一般通过set方法将部分注入到整体中
如一个电脑(Computer)有键盘(Keyboard),鼠标(Mouse)等组成,电脑坏了,不一定代码键盘和鼠标就不能用了。示例代码如下:

class Computer
{
    private Keyboard keyboard;
    private Mouse mouse;

    public void setKeyboard(Keyboard keyboard) {
        this.keyboard = keyboard;
    }

    public void setMouse(Mouse mouse) {
        this.mouse = mouse;
    }
}

class Keyboard
{
    //...
}

class Mouse
{
    //...
}

聚合关系在UML类图中由实线和空心菱形表示,由部分指向整体该案例在UML类图中的表达如下所示:
在这里插入图片描述

6、组合关系及UML类图表示

组合关系表示的也是整体与部分的关系但整体与部分不可分开,表现出同生共死的关系它是关联关系的特例组合关系一般在整体创建的时候就自动创建部分了
如一个人(Person)由头(Head)、手(Hand)、腿(Leg)等构成,一个人可以没有手和腿,但是一定不能没有头,因此人与头是组合关系,而人与手和腿是聚合关系,示例代码如下:

class Person
{
    private Head head=new Head();//与Person是组合关系,Person创建,则Head创建;Person销毁,则Head销毁;
    private Hand hand;//与Person是聚合关系
    private Leg leg;//与Person是聚合关系

    public void setHand(Hand hand) {
        this.hand = hand;
    }

    public void setLeg(Leg leg) {
        this.leg = leg;
    }
}
class Head
{
    
}
class Hand
{
    
}
class Leg
{
    
}

组合关系在UML类图中由实线和实心菱形表示,由部分指向整体该案例在UML类图中的表达如下所示:在这里插入图片描述

三、如何绘制UML类图?

1. IDEA安装PlantUML Intergration插件

打开IDEA,点击File -> Settings,打开Settings窗口,选择Plugins,在搜索栏搜索PlantUML,点击PlantUML Intergration 后面的安装,完成插件安装,重启IDEA后,即可使用该插件。
在这里插入图片描述

2. PlantUML用法

  1. 选择一个包,右键选择New,然后点击PlantUML File
    在这里插入图片描述
  2. 选择UML类图,并为之命名,创建一个UML类图文件
    在这里插入图片描述
  3. UML类图文件由编辑区和视图区两部分组成,用户通过编辑区按照指定的语法编写代码,视图区自动根据语法绘制类图。通常我们新建完UML类图后,可以通过参考自动生成的代码及其对应的视图,学习常用的语法,然后,我们就可以将@startuml和@enduml之间的代码删除,然后根据自己的设计编写代码,绘制自己的类图。
    在这里插入图片描述
    note:如果你的试图区不能正常显示,可以参考该文章:https://plantuml.com/graphviz-dot(包括Linux等各个平台的处理方法)
  4. 关于绘制UML类图的常见语法,下面进行详解讲解。

3. PlantUML绘制UML类图的常见语法

3.1 语法精髓

UML类图中最重要的就是绘制类与类之间的关系,每种关系有不同的图形元素连接,每种图形元素对应不同的语法,我总结出UML类图中涉及的图形元素及其对应的语法如下

  1. 实线 对应语法是两个减号 “–”
  2. 虚线 对应语法是两个点 “…”
  3. 实心左箭头 对应语法是一个左括号 “<”
  4. 实心右箭头 对应语法是一个右括号 “>”
  5. 空心箭头 对应语法是一个左括号加竖线 “<|”
  6. 空心菱形 对应语法是字母o “o”
  7. 实心菱形 对应语法是符号* “*”

通过对以上图形语法的组合,即可绘制UML类图中所有的关系图形,如UML类图中依赖关系是通过虚线加空心箭头表达,那么对应的语法就是 <|…

3.2 绘制类与类之间的依赖关系语法

如A类依赖于B类,而UML类图中依赖关系是由虚线(…)加实心箭头(<)表示的,因此示例代码如下:

@startuml

class A{
int a;
void fun1();
'可根据你类的设计补充相关的属性及方法,
'属性不带括号,方法带括号
}
class B

B <.. A

@enduml

在这里插入图片描述

3.3 绘制类与类之间的泛化关系语法

如A类继承于B类,而UML类图中泛化关系是由实线(–)加空心箭头(<|)表示的,因此示例代码如下:

@startuml

class A
class B

B <|-- A

@enduml

在这里插入图片描述

3.4 绘制类与类之间的实现关系语法

如A类实现接口B类,而UML类图中实现关系是由虚线(…)加空心箭头(<|)表示的,因此示例代码如下:

@startuml

interface A
class B

A <|.. B

@enduml

在这里插入图片描述

3.5 绘制类与类之间的关联关系语法

如A类和B类之间是一对一的关联关系,而UML类图中关联关系是由实线(–)加实心箭头(<)表示的,因此示例代码如下:

@startuml

class A
class B

'通过在语法前的双引号中添加文字
'可以为线两端上添加注释
A "1"<..>"1" B

@enduml

在这里插入图片描述

3.6 绘制类与类之间的聚合关系语法

如A类和B类之间是聚合关系,B聚合于A,而UML类图中聚合关系是由实线(–)加空心菱形(o)表示的,因此示例代码如下:

@startuml

class A
class B

'通过在最后一个类后加冒号,
'冒号后面的文字可以添加带线中间显示
A o-- B:聚合

@enduml

在这里插入图片描述

3.7 绘制类与类之间的组合关系语法

如A类和B类之间是组合关系,B组合于A,而UML类图中组合关系是由实线(–)加实心菱形(*)表示的,因此示例代码如下:

@startuml

class A
class B

A *-- B

@enduml

在这里插入图片描述

四、UML类图所有类之间关系及符号表示一览图

本文开篇我就放了这张图,如果您是从头看到现在,那么再看这张图,您就能发现它涵盖了本文的所有内容,图中包含了类之间的六种关系,每种关系的表达符号,每个符号的语法。
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐