Java设计模式UML之类图精解

 更新时间:2022年02月07日 16:41:18   作者:张起灵-小哥  
在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法

1.UML基本介绍

  • UML——Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。
  • UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等,如下图:

上面的截图就是一个UML类图的案例,只不过这是在eclipse中的,下面的类图我会在IDEA中使用。

画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理,UML图分类:👇👇👇

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

类图是描述类与类之间的关系的,是UML图中最核心的。

2.UML类图

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

类之间的关系:  依赖、泛化(继承)、实现、关联、聚合与组合。

2.1 类关系——依赖

只要是在类中用到了对方,那么他们之间就存在依赖关系。   来看下面的代码

package com.szh.uml.dependence;
 
public class PersonServiceBean {
	private PersonDao personDao;
 
	public void save(Person person) {
	}
 
	public IDCard getIDCard(Integer personId) {
		return null;
	}
 
	public void modify() {
		Department department = new Department();
	}
}
package com.szh.uml.dependence;
 
public class PersonDao {
}
package com.szh.uml.dependence;
 
public class Person {
}
package com.szh.uml.dependence;
 
public class IDCard {
}
package com.szh.uml.dependence;
 
public class Department {
}

上面的代码中,PersonServiceBean类中用到了Department、Person等这几个类,那么我们就可以说PersonServiceBean类与它们几个类之间存在依赖关系。

  • 类中用到了对方
  • 类的成员属性
  • 方法的返回类型
  • 方法接收的参数类型
  • 方法体内部使用到

依赖的符号就是 虚线 + 一个箭头。

2.2 类关系——泛化

泛化实际上就是继承,它是依赖关系的一种特例。

如果A类继承了B类,那么我们就可以说 A和B 之间存在泛化关系。

package com.szh.uml.generalization;
 
public abstract class DaoSupport {
 
	public void save(Object entity) {
	}
 
	public void delete(Object id) {
	}
}
package com.szh.uml.generalization;
 
public class PersonServiceBean extends DaoSupport {
}

继承就不再多说了,这里需要指出的一点是:IDEA中的泛化符号不太一样,一般来说,泛化的符号应该是 实线 + 一个空心三角形,而IDEA中则是下图这样。

2.3 类关系——实现

实现关系其实就是面向接口而言,它和泛化一样,也是依赖关系的一种特例。

如果A类实现了接口B,那么我们就可以说A和B之间存在实现关系。

package com.szh.uml.implementation;
 
public interface PersonService {
 
	public void delete(Integer id);
 
}
package com.szh.uml.implementation;
 
public class PersonServiceBean implements PersonService{
 
	@Override
	public void delete(Integer id) {
		System.out.println("delete..");
	}
 
}

实现接口这个也不再多说了。 这里需要指出的一点是:IDEA中的实现符号不太一样,一般来说,实现的符号应该是 虚线 + 一个空心三角形,而IDEA中则是下图这样。

2.4 类关系——关联

关联关系 实际上就是类与类之间的联系,他是依赖关系的特例。关联具有导航性:  即双向关系或单向关系。

关系具有多重性:  如“1”(表示有且仅有一个),“0...”(表示0个或者多个),“0,1”(表示0个或者一个),“n.….m”(表示n到 m个都可以), "m.….*”(表示至少m个)

package com.szh.uml.association1;
 
/**
 *
 */
public class Person {
    private IDCard card;
}
package com.szh.uml.association1;
 
/**
 *
 */
public class IDCard {
}

这里我们的理解就是Person类表示人,IDCard类表示身份证类,一个人只有一个身份证号、一个身份证号只属于一个人,所以它俩之间就存在着一对一的关联关系。  关联的符号就是 实线 + 一个箭头。

下图是单向的关联关系,当我们在IDCard类中声明了Person类的成员变量时,这二者之间的关联关系就转换成了双向。(图中还有组合符号,我们后面会说)

2.5 类关系——聚合

聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性。

如:  一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成;组成电脑的各个配件是可以从电脑上分离出来的,使用带空心菱形的实线来表示。

package com.szh.uml.aggregation;
 
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;
	}
	
}
package com.szh.uml.aggregation;
 
public class Monitor {
}
package com.szh.uml.aggregation;
 
public class Mouse {
}

聚合的符号一般来说应该是 实线 + 空心菱形,组合的符号则是 实线 + 实心菱形,IDEA中聚合、组合的符号都是下图这样。

2.6 类关系——组合

组合关系:  也是整体与部分的关系,但是整体与部分不可以分开。

再看一个案例:在程序中我们定义实体: Person与IDCard、Head,那么 Head和 Person 就是组合, IDCard 和Person就是聚合。

但是如果在程序中 Person实体中定义了对IDCard进行级联删除,即删除Person时连同IDCard 一起删除,那么IDCard和 Person就是组合了。

package com.szh.uml.composition;
 
public class Computer {
 
	private Mouse mouse = new Mouse();
	private Monitor monitor = new Monitor();
 
	public void setMouse(Mouse mouse) {
		this.mouse = mouse;
	}
 
	public void setMonitor(Monitor monitor) {
		this.monitor = monitor;
	}
	
}
package com.szh.uml.composition;
 
public class Monitor {
}
package com.szh.uml.composition;
 
public class Mouse {
}
package com.szh.uml.composition;
 
public class Person {
    private IDCard card;
    private Head head = new Head();
}
package com.szh.uml.composition;
 
public class Head {
}
package com.szh.uml.composition;
 
public class IDCard {
}

到此这篇关于Java设计模式UML之类图精解的文章就介绍到这了,更多相关Java 设计模式类图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解Spring中bean的生命周期介绍

    深入理解Spring中bean的生命周期介绍

    本篇文章主要介绍了深入理解Spring中bean的生命周期介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • JAVA输出流与输入流代码实例

    JAVA输出流与输入流代码实例

    这篇文章主要介绍了JAVA输出流与输入流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 简单了解Java编程中抛出异常的方法

    简单了解Java编程中抛出异常的方法

    这篇文章主要介绍了Java编程中抛出异常的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • 解决JAVA遍历List集合,删除数据时出现的问题

    解决JAVA遍历List集合,删除数据时出现的问题

    这篇文章主要介绍了解决JAVA遍历List集合时,删除数据出现的问题,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java8 Stream流多字段求和、汇聚的实例

    Java8 Stream流多字段求和、汇聚的实例

    这篇文章主要介绍了Java8 Stream流多字段求和、汇聚的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • java实现对Hadoop的操作

    java实现对Hadoop的操作

    这篇文章主要介绍了java实现对Hadoop的操作,通过非常完整详细的代码展示了如何去进行一系列操作,包括基本操作,文件读写,需要的朋友可以参考下
    2021-07-07
  • 详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则

    在本文里我们给大家详细分享了关于java内部类的访问格式和规则知识点内容,有兴趣的朋友们学习下。
    2018-10-10
  • Intellij IDEA解析jacoco结果文件的方法

    Intellij IDEA解析jacoco结果文件的方法

    这篇文章主要介绍了Intellij IDEA解析jacoco结果文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java Iterator接口实现代码解析

    Java Iterator接口实现代码解析

    这篇文章主要介绍了Java Iterator接口实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • springboot使用消息中间件

    springboot使用消息中间件

    这篇文章主要介绍了springboot使用消息中间件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论