初探设计模式(一)10分钟速成UML类图

954 阅读4分钟

UML类图是什么

维基百科:In software engineering, a class diagram in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the relationships among objects. 翻译下:UML类图是一种通过展示系统中的类、属性、方法以及对象间关系,来描述系统结构的静态结构图

提示,UML图有很多种,比如时序图、用例图,这里只针对类图做讲解。

为什么要学习UML类图

这牵扯到一个问题,设计模式是什么? 设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。

那么,设计模式的本质是什么? 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解

一句话总结: UML 类图是表达设计模式的一种方法。

如何学习UML类图

下面,从类的表示、类间关系表示两个角度入手来认识UML类图。为了方便上手,主要形式为举例。(编程语言均为Java)

类的表示

类的定义如下:

class User {
    private long id;
    private String name;
    
    public void setName(String name) {
        this.name = name
    }
    public String getName() {
        return this.name;
    }
}

类图如下:(这里用掘金自带的Mermaid图表画的图。如果画图工具不同,展示会有轻微的区别,不用太在意)

classDiagram
    class User{
    -long id
    -String name
    +setName(name)
    +getName() String
}
  • 整体分为三部分
    • 上部:包含类名,是唯一必填的信息
    • 中部:包含类的属性,仅在描述实例时需要
    • 底部:包含类操作(方法)
  • 访问修饰符
    • public(+)
    • private(-)
    • protected(#)
    • package(~)
    • static(下划线)

类间关系的表示

总览

类间关系图形表现形式含义说明
继承(泛化)实线+空心箭头extends关键字对象与对象之间的继承关系,"is a"
实现虚线+空心箭头implements关键字接口及实现类之间的关系
关联实线+箭头(可选)成员变量对象相互知道的关系,箭头强调一个对象知道另一个
依赖虚线+空心箭头方法入参一个对象在运行期间会用到另一个对象的关系
聚合实线+箭头+空心菱形-整体与部分的关系,整体不存在了,部分依然存在
组合实线+箭头+实心菱形-整体与部分的关系,整体不存在了,部分也不存在

继承(Generalization)与实现(Implementation)

  • 继承:实线+空心箭头(Mermaid语法展示为实心箭头)

    class A {}
    class B extends A {}
    
    classDiagram
    A <|-- B
    
  • 实现:虚线+空心箭头(Mermaid语法展示为实心箭头)

    interface A {}
    class B implements A {}
    
    classDiagram
    A <|.. B
    

关联(Association)与依赖(Dependency)

  • 关联:实线+箭头(可选),默认不强调方向,下图表示A知道B,在代码中通常以成员变量形式实现。

    class A {
        private B b;
    }
    
    classDiagram
    A --> B
    
  • 依赖:虚线+箭头(可选),是一种弱关联关系,表示一个对象在运行期间会用到另一个对象,在代码中通常以类的构造方法或者类方法的入参实现。

    class A {
       public void method(B b) {}
    }
    
    classDiagram
    A ..> B
    

聚合(Aggregation)与组合(Composition)

均为整体与部分的关系。

  • 聚合:实线+箭头+空心菱形。B由A组成,B不存在了,A依然存在。比如:学生和学校。

    classDiagram
    A o--> B
    
  • 组合:实线+箭头+实心菱形。B由A组成,B不存在了,A也不存在了。比如:汽车与方向盘。

    classDiagram
    A *--> B
    

常用的UML类图绘制工具

  • plantUML,也是写代码画图的形式,我一般用Intellij IDEA的插件画时序图,非常方便。
  • Draw.io,可以在线画图,也可以下载客户端。画图很方便,我个人比较喜欢。
  • Mermaid插件,第一次用,有些图和我的认知不太相符,目前体验一般,待探索。
  • ProcessOn,在线的画图工具,比较方便,但有免费个数限制

参考