寂然解读设计模式 - UML类图&类的六大关系

简介: 本章节重点需要大家掌握的是类图,上面提到,类图是描述类与类之间的关系的,同时也是 UML 图中最核心的,在讲解设计模式时,我们必然会使用类图,为了小伙伴们在听设计模式的时候不会带着朦胧,所以我们来带着大家画类图,以及梳理类的六大关系
I walk very slowly, but I never walk backwards 

UML类图&类的六大关系


寂然

大家好~,我是寂然,本节课呢,我来给大家介绍UML类图&类的六大关系,说起UML类图,前面在讲解设计模式原则的时候,其实我们就接触到了UML类图,各位小伙伴如果有UML类图的基础,这个阶段大家可以跳过,直接进入后面设计模式的学习,如果大家没有系统的接触过UML类图,就可以通过本教程来掌握UML类图的使用,以及梳理类的六大关系,后面的设计模式中会大量使用UML类图来描述,大家可以循序渐进,话不多说,我们直接进入正题,老规矩,首先带大家了解一下UML以及UML类图的官方定义

官方定义

UML - Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,

用于帮助软件开发人员进行思考和记录思路的结果

UML图分为很多种,类图是描述类与类之间的关系的,是 UML 图中最核心的,UML类图定义如下

UML类图 - 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系图

OK,大家先简单了解下概念,下面我们对于UML图以及分类进行基本的介绍

基本介绍

UML 本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等,是一种图形化语言,如图所示


1602571883648.png


画 UML 图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理,例如下面示例的,某成型的UML图 ,所以用一句话概括UML图,使用图形和符号描述软件模型中的各个元素和他们之间的关系

建模工具

使用 UML 来建模,常用的工具有很多种, 也可以使用一些插件来建模,下面我们简要介绍一下

  • word,利用word工具可以绘制简单的UML图,但是这是一种非专业的手段,而且绘制起来比较麻烦
  • 利用VISIO工具进行UML图的绘制
  • 利用PowerDesigner工具绘制UML图形,PowerDesigner支持标准数据建模UML
  • 利用Eclipse中的AmaterasUML插件,也可以进行UML的绘制
  • IDEA中可以使用PlantUML插件来画类图,也可以下载安装UML Support插件 附录图

等等,当然还有一些其他好用开源的画UML类图的软件,大家可以自行下载,根据环境要求以及个人的习惯进行选择,这里我们使用VISIO工具进行UML图的绘制,以及在idea中介绍UML Support插件 自动生成类图

UML 图分类

  • 用例图(use case)
  • 静态结构图:类图、对象图、包图、组件图、部署图
  • 动态行为图:交互图(时序图与协作图)、状态图、活动图

这里简单介绍一下分类,对于各个类型的UML图的形式以及区别,这里不做详述,本章节重点需要大家掌握的是类图上面提到,类图是描述类与类之间的关系的,同时也是 UML 图中最核心的,在讲解设计模式时,我们必然会使用类图,为了小伙伴们在听设计模式的时候不会带着朦胧,所以我们来带着大家画类图,以及梳理类的六大关系

依赖关系

是一种使用关系,即一个类的实现需要另一个类的协助,逻辑上能用"use a"表示, 只要是在类中用到了对方,那么他们之间就存在依赖关系,如果没有对方,无法通过编译 ,需要注意的是,其他五种关系都是依赖关系的特例

代码体现
  • 类中用到了另一个类
  • 另一个类的成员属性
  • 另一个类方法的返回值类型
  • 另一个类方法接收的参数类型
  • 另一个类方法内部使用到
//依赖关系展示
public class PersonServiceBean {

    private PersonDao personDao;//类的成员属性

    public void save(Person person) { //类方法接收的参数类型
    }

    public IDCard getIDCard(Integer personId) { //类方法的返回值类型
        return new IDCard();
    }

    public void modify() {
        //虽然违反了迪米特法则,但仍然是依赖关系   
        Department department = new Department(); //方法内部使用到
    }
}

class PersonDao { }

class IDCard { }

class Person { }

class Department { }
UML图示

UML符号:一条虚线 + 箭头 相关的UML类图如下图所示


1602576157872.png


泛化关系

泛化关系实际上就是继承关系,他是依赖关系的特例 , 如果 A 类继承了 B 类,我们就说 A 和 B 存在泛化关系

代码体现
public class PersonBean {

    public void save(Object entity){
        //TODO...
    }
    public void delete(Object id){
        //TODO...
    }
}

public class PersonServiceBean extends PersonBean{ }
UML图示

UML符号: 带三角箭头的实线,箭头指向父类 相关的UML类图如下图所示


1602577349497.png


实现关系

实现关系实际上就是 A 类实现 B 接口,就表示A类和B类具有实现关系,也是依赖关系的特例

代码体现
public interface PersonService {

    public void delete(Integer id);

}
public class PersonServiceBean implements PersonService{

    @Override
    public void delete(Integer id) {
       //TODO..
    }
}
UML图示

UML符号: 带三角箭头的虚线,箭头指向接口 ,相关的UML类图如下图所示


1602578086391.png


关联关系

关联关系实际上就是类与类之间的联系,体现的是业务逻辑的关系 ,是依赖关系的特例

关联具有导航性:即双向关系或单向关系

关系具有多重性:一对一,一对多,多对多

代码体现
//单向一对一
class IDCard {

}

class Person {
    private IDCard idCard;
}

//双向一对一
class IDCard {
    private Person person;
}

class Person {
    private IDCard idCard;
}

//老师与学生 一对多....
UML图示

UMl符号:双向关联,一条实线或一条实线 + 两个箭头;单向关联,一条实线 + 一个箭头


1602579786320.png


聚合关系

聚合关系表示的是整体和部分的关系,整体与部分可以分开聚合关系是关联关系的特例,所以他具有关联的导航性与多重性,是强的关联关系,关联和聚合在语法上无法区分,必须考察具体的逻辑关系

代码体现

例如,一台电脑由键盘,显示器,鼠标等组成,电脑的各个配件是可以从电脑上分离出来,独立存在,那类Computer ,Mouse,Monitor三者就构成聚合关系

上面提到,聚合关系是关联关系的特例,所以Computer 聚合一个 mouse,称为单聚合,聚合多个类称为多聚合

//聚合关系
public class Computer {

    private Mouse mouse;

    private Monitor monitor;

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

    public void setMonitor(Monitor monitor) {
        this.monitor = monitor;
    }
}

class Mouse{ } 

class Monitor{ }
UML图示

UML符号: 一条实线 + 空心菱形 ,相关的类图如下图所示


1602582812733.png


组合关系

组合关系表述的也是整体与部分的关系,但是整体与部分不可以分开 ,同样,聚合关系是关联关系的特例,必须考察具体的逻辑关系而定,语法层面是无法区分的

代码体现
public class Person {
    private IDCard idCard; //聚合关系
    private Head head = new Head(); //组合关系
}

class Head{ }
class IDcard{ }

逻辑关系里,如果关系是可以分开的,是聚合关系,如果关系是不可以分开的,是组合关系,身份证和人类的关系,业务逻辑上丢掉还可以补办,所以认为是聚合关系,而Head丢掉人类就无存活,所以认为是组合关系,上述案中,如果我们再业务逻辑中认为Mouse,Monitor和Computer是不可分离的,则升级为组合关系

UML图示

UML符号:一条实线 + 实心菱形


1602668863256.png


下节预告

而我们实际开发中,一般情况下使用idea UML Support插件 选中就可以帮我们自动生成类图,复杂的大家可以使用上面提到的建模工具去画就可以,明确了类图,以及类之间的六大关系,设计模式的前置基础篇就正式完结了!

OK,下一节,我们正式进入第三篇章,设计模式的学习,第一个讲解的设计模式是单例模式&八种写法,最后,希望大家在学习的过程中,能够感觉到设计模式的有趣之处,高效而愉快的学习,那我们下期见~

相关文章
|
3月前
|
Java uml
使用工厂方法模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程序实
该博客文章通过UML类图和Java代码示例,展示了如何使用工厂方法模式设计一个支持加法、减法、乘法和除法运算的计算机程序,并严格按照类图设计实现程序。
|
3月前
|
Java uml
1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程
该博客文章展示了如何使用简单工厂模式设计一个程序,该程序能够根据用户输入的运算符(加、减、乘、除)对两个数进行计算,并提供了相应的UML类图和Java源码实现。
1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
2月前
|
设计模式 Java 测试技术
Java设计模式-UML与设计原则(1)
Java设计模式-UML与设计原则(1)
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
48 2
|
3月前
|
数据可视化 Java uml
精通UML:从类图到序列图的实战指南
【8月更文第23天】统一建模语言(Unified Modeling Language, UML)是一种用于软件工程的标准图形化语言,它提供了一套工具来帮助开发团队可视化、构造和文档化软件系统。在UML中,类图和序列图是最常用也是最重要的两种图。类图用于描述系统的静态结构,而序列图则用于表示对象之间的交互和系统的动态行为。
177 5
|
3月前
|
设计模式 uml
设计模式常用的UML图------类图
这篇文章介绍了UML中类图的基本概念和用途,详细解释了类与接口、类之间的关系,包括继承、实现、组合、聚合、关联和依赖等六种关系,并展示了它们在类图中的表示方法。
设计模式常用的UML图------类图
|
3月前
|
uml
UML 类图几种关系(依赖、关联、泛化、实现、聚合、组合)及其对应代码
UML 类图几种关系(依赖、关联、泛化、实现、聚合、组合)及其对应代码
353 0
|
3月前
|
设计模式 存储 安全
18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)
18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)
99 0
|
22天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式