设计模式00-UML类图

644 阅读5分钟

1、前言

相信很多同学在学习设计模式过程,会遇到各式各样的类图,且大家做法很一致看不懂,一律跳过类图,直接看代码。随着学习设计模式的深入,你会发现UML其实就是一个设计模式的灵魂,一个UML类图可以总结出设计模式理念思想,以及后续的代码,因此,今天让我们一起来学习UML,作为设计模式的入门

2、基础概念

UML(Unified Modeling Language,统一建模语言)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。

上面的定义是不是有点模糊,用个人的理解就是UML类图是通过图表的形式进行建模,将文字描述转变为图表的定义。就好像我们查看数据趋势的曲线图、柱状图等,光看数据很少能看出效果,转化为图表可以更加深刻的理解

3、类图的基本属性

3.1、UML类图的构成

下面我们通过一个Person类,来介绍下UML类图的属性

public class Person {

    public String name;

    private int age;

    protected Double weight;
    
    private int sex = 0;

    public void setName(String name) { this.name = name; }

    public String getName(){ return name; }

    private String eat(String food){ return "吃" + food; }

    protected int age(){ return age; }
    
}

所谓UML类图就是一个分成了三个格子的矩形,其中

  • 第一个格子:表示类名/接口名

  • 第二个格子:表示类的属性信息以及权限

    • 具体格式为:权限 属性名:类型 [ = 默认值 ]
  • 第三个格子:表示类的方法以及权限和返回信息

    • 具体格式为:权限 方法名称(参数列表) [ : 返回类型]
  • 其中权限常用的三个如下:

    • +表示 public
    • -表示 private
    • #表示 protected

image-20211110111150052

3.2、UML类图之间的关系

相信看到这里,大家对类图有了自己的认识,下面我们继续了解下UML类图的其他内容,类图之间的关系。

3.2.1、泛化关系(继承关系)

所谓的泛化(Generalization)关系,就是表示类与类之间的继承关系,接口与接口之间的继承关系,用空心三角形+实线表示,箭头指向父类

个人理解:继承就是一种是什么的关系,就像学生、老师都属于人这个范畴;人和鸟、兽都属于动物的范畴

代码体现:继承 extends

示例:

Student和Teacher继承父类Person

image-20211110142823405

3.2.2、实现关系

所谓实现(Realization)关系,就跟我们在实际开发过程中的类与接口的实现关系一致,用空心三角形+虚线表示,箭头指向接口

个人理解:实现就是一种有什么的关系,像学生就拥有学习九年义务教育的权利,老师拥有国家的教师补贴的福利等

代码体现:接口实现 implements

示例:

这边我们假设存在一个接口(interface)IRight,用于定义一个right()方法,返回该用户拥有什么权利,然后Student和Teacher去实现这个接口

public interface IRight{
    String right();
}

image-20211110151532723

3.2.3、关联关系

所谓关联(Association)关系,更像一种拥有的关联关系,将两个独立的对象关联起来,一个类知道另一个类的属性和方法,用实线尖头表示

个人理解:就好像学生跟班主任是一种固定的关系,学生记录着班主任的信息,班主任有持有学生的名单

代码体现:一个类是另一个类的成员变量

示例:

对于学生来说学生依赖班主任,对于班主任来说班主任依赖学生,因为是双向关系可以直接用实线不带尖头表示

image-20211111112635684

3.2.4、聚合关系

所谓聚合(Aggregation)关系,强调的是整体和部分的关系,既整体拥有部分(has-a),用空心菱形+实线尖头表示,菱形指向整体,尖头指向部分

个人理解:就好比我们人的穿着,我们的服饰有衣服、裤子、帽子等,这个服饰对于人来说可有可无,就算没有也不影响,既:人这个对象的生命周期和服饰这些对象的生命周期不同

代码体现:一个类是另一个类的成员变量

示例:

image-20211111115051599

3.2.5、组合关系

所谓组合(Composition)关系,同样强调的是整合和部分的关系,但是更准确的说是整体包含部分(contains-a),用实心菱形+实线尖头表示,菱形指向整体,尖头指向部分

个人理解:就好比公司与部门的关系,没有公司就不存在部门,部门与公司共存,既:两者的生命周期是一致的

代码体现:一个类是另一个类的成员变量

示例:

image-20211111144129122

3.2.6、依赖关系

所谓依赖(Dependence)关系,是一种较弱的关联关系,用虚线箭头表示,尖头指向别依赖方

个人理解:就像学生在参加某个讲座的时候需要使用入场证,使用完后,该证就不用了,下次参加讲座用的又是另一张入场证

代码体现:一个类是另一个类的局部变量、方法参数等

示例:

public class Certificate {

    String name;

    public Certificate(String name) {
        this.name = name;
    }
    public Boolean entrance(){
        return true;
    }
}

public class Student {

    private String name;

    private int age;

    // 方法参数
    public Boolean entranceByCertificate(Certificate certificate){

        if (certificate==null) {
            return false;
        }
        return certificate.entrance();
    }
}

从Student指向Certificate(被依赖方)

image-20211111110527351

3.3、关系的强弱

相信看到这里大家对各种关系都有所认知了,关于关系的强弱,笔者其实不必过多阐述,通过阅读文章可知,文章依次往下的顺序刚好就是UML类图之间的强弱关系,既:

泛化关系 = 实现关系 > 关联关系 > 聚合关系 > 组合关系 > 依赖关系

这里存在分歧的是点是:

泛化关系 = 实现关系,应该改为 泛化关系 >= 实现关系,既从代码层面分析泛化(继承)有一点强于实现,这里笔者就不做过多的阐述,感兴趣的读者可以自行研究。