UML类图和关系--idea使用PlantUML插件画类图_plantuml idea_新刘海的博客-程序员宅基地

技术标签: uml类图  

注释:资料根据尚硅谷设计模式课程中的UML使用整理,老师使用的是eclipse的插件手动画的,这里使用idea的PlantUML自动生成类图

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

类图 - 依赖关系(Dependence)

只要是在类中用到了对方,那么他们之间就存在依赖关系。

应用案例

Java代码

public class PersonDao{
    }
public class IDCard{
    }
public class Person{
    }
public class Department{
    }

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();
    }
}

UML类图 + PlantUML代码

在这里插入图片描述

@startuml
     
class PersonDao
class IDCard
class Person 
class Department
class PersonServiceBean{
    - PersonDao personDao
    + void save(Person person)
    + IDCard getIDCard(Integer personid)
    + void modify()
}
PersonDao <.. PersonServiceBean
IDCard <.. PersonServiceBean
Person <.. PersonServiceBean
Department <.. PersonServiceBean
         
@enduml

小结

  1. 类中用到了对方
  2. 如果是类的成员属性
  3. 如果是方法的返回类型
  4. 是方法接收的参数类型
  5. 方法中使用到(局部变量)

类图 - 泛化关系(generalization)

泛化关系实际上就是继承关系,他是依赖关系的特例

应用案例

Java代码

public abstract class DaoSupport {
    
    public void save(Object entity) {
    
    }
    public void delete(Object id) {
    
    }
}
public class PersonServiceBean extends DaoSupport{
    }

UML类图 + PlantUML代码

在这里插入图片描述

 @startuml
 
abstract class DaoSupport{
   + void save(Object entity)
   + void delete(Object id)
}
class PersonServiceBean

DaoSupport <|-- PersonServiceBean

@enduml

小结

  1. 泛化关系实际上就是继承关系
  2. 如果A类继承了B类,我们就说A和B存在泛化关系

类图—实现关系(Implementation)

实现关系实际上就是A类实现B接口,他是依赖关系的特例

应用案例

Java代码

public interface PersonService {
    
	public void delete(Interger id);
}
public class PersonServiceBean implements PersonService {
    
    public void delete(Integer id) {
    
    }
}

UML类图 + PlantUML代码

在这里插入图片描述

@startuml
interface PersonService
class PersonServiceBean

PersonService <|... PersonServiceBean
@enduml

类图—关联关系(Association)

  1. 关联关系实际上就是类与类之间的联系,他是依赖关系的特例
  2. 关联具有导航性:即双向关系或单向关系
  3. 关系具有多重性:如“1”(表示有且仅有一个),“0…”(表示0个或者多个), “0,1”(表示0个或者一个),“n…m”(表示n到 m个都可以),“m…*”(表示至少m 个)。

应用案例

Java代码

public class Person {
    
    private IDCard idCard;
}
public class IDCard {
    
    private Person person;
}

UML类图 + PlantUML代码

在这里插入图片描述

@startuml
class Person{
    - IDCard idCard
}
class IDCard{
    - Person person
}
Person <-- IDCard
Person --> IDCard
@enduml

类图—聚合关系(Aggregation)

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

应用案例

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

Java代码

public class Monitor {
    
}
public class Mouse {
    
}
public class Computer {
    
    private Mouse mouse;//鼠标可以和Computer分离
    private Monitor monitor;//显示器可以和Computer分离

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

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

UML类图 + PlantUML代码

在这里插入图片描述

@startuml
class Monitor
class Mouse
class Computer{
   - Monitor Monitor
   - Mouse mouse
}
Computer o-- Monitor
Computer o-- Mouse
     
@enduml

小结

如果A类使用了B类但是不是必须使用到B类,并不是创建A时B类必须被创建/马上被创建(并不是同生共死)。那么他们就是聚合关系

类图—组合关系(Composition)

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

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

应用案例1

Java代码

public class IDCard{}
public class Head{}
      
public class Person{
    //IDCard并不是必须存在/实例化/创建的,是聚合关系
    private IDCard idCard;
    //Person 类创建的时候,Head类就会被实例化那么他们是同生共死的关系,他们就是组合关系
    private Head head = new Head();
}

UML类图 + PlantUML代码

在这里插入图片描述

@startuml

class IDCard
class Head
class Person{
   - IDCard idCard
   - Head head = new Head()
}
      
Person o-- IDCard
Person *-- Head
      
@enduml

应用案例2

Java代码

public class Mouse {
    }
public class Monitor {
    }

///Computer被创建时,Mouse和Monitor会马上被new/实例化出来,组合关系
public class Computer {
    
    private Mouse mouse = new Mouse();//鼠标和Computer不能分离
    private Monitor monitor = new Monitor();//显示器和Computer不能分离

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

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

UML类图 + PlantUML代码

在这里插入图片描述

@startuml

class Monitor
class Mouse
class Computer{
    - Monitor Monitor = new Monitor()
    - Mouse mouse = new Mouse)(
}
      
Computer *-- Monitor
Computer *-- Mouse
      
@enduml
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45425667/article/details/116134337

智能推荐

蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)板子介绍-程序员宅基地

蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)_stm32g431rbt6

华为首次自曝“天才少年”成果:入职不到一年就干成这件大事,网友:值200万年薪!| 留言送书..._3D视觉工坊的博客-程序员宅基地

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达来源 | 量子位(QbitAI)编辑| 梦晨、丰色、萧萧、发自、凹非寺要说起华为“天才少年”,那话题度可以说是直接拉满。但在百万级..._华为诺亚方舟年薪

CDH之CDS部署与测试:CDH 部署Spark2.4.0(Centos7.2 | CDH5.16.1 | Spark2.4.0)-程序员宅基地

0 CDH的SparkCDH上面Spark的版本都是1.6的版本1.查看官网部署文档https://docs.cloudera.com/documentation/spark2/latest.html官网给出的一些建议和前置条件,https://docs.cloudera.com/documentation/spark2/latest/topics/spark2_requirements.ht...

深入学习Apache模块mod_rewrite-程序员宅基地

人们一提到.htaccess配置文件,首先映入他们脑海的就是用mod_rewrite进行URL地址重定向。对mod_rewrite的看法各不相同,为了就人们对mod_rewrite是怎么认识的有一个快速的看法,我在twitter上搜索了一下"mod_rewrite",并且将我写这篇文章时的前几个搜索页面的结果找出来: midk:啊!.hatccess和mod_rewrite是如此的痛苦……..._apache module mod_rewrite

ACM周记 - 二分法-程序员宅基地

先说一下:亟待解决的题今天下午打CodeForces第二题,我至今还是不知道错在哪QAQ。第二题就是给定一个数组,求出让数组升序的最少移动次数。以下是我自己的思路,但是出错了。这个题包括两种情况,一种是交换位置,另一种是插入。刚开始我只注意到了交换位置,但是尝试时发现第三个数据没过。这时我突然想到一个自方法:先求出最长不下降子序列元素个数,然后用原数组个数一减就出来了。于是有了这段代码:#include <iostream>#include <algorithm>

浅谈Web数据交互(二)-程序员宅基地

3.XML方式 前面的两种方式都能传递数据,但是都有一个问题,就是提交数据后,页面会刷新,由于web是无状态的,所以我们必须通过代码来维持页面上的状态。(在asp.net里面微软通过ViewState来维护)所以我们要做到交互数据但是不刷新页面的话,就只有用xml了。 哇,不知道xml是什么冬冬啊?倒…… XML (eXtensible Markup Language)建议你看看两只老虎的《无废话

随便推点

git基础命令操作和代码提交与撤回_tortoisegit撤销提交_job_csdn的博客-程序员宅基地

git 使用命令 提交代码,git 解决错误的 commit,git 解决冲突_tortoisegit撤销提交

linux ln命令详解_牛奔的博客-程序员宅基地

介绍ln是linux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。平时使用感觉就像桌面应用上的快捷图标一样,比如你安装的nginx文件在usr/local/n..._ln -f

常用的激活函数及其tf.keras实现_tf.keras.activations.relu自定义-程序员宅基地

如果神经网络中没有激活函数,无论网络结构再如何复杂,学习的模型都只能得到线性函数,只能解决线性可分问题。激活函数的引入,使得神经网络能够拟合任何一个非线性函数,可用于解决线性不可分问题。不同的激活函数具有不同的特征,适合的场景也因数据的差异而各不相同,需要根据具体的情况选择合适的激活函数,否则无法得到一个令人满意的模型。这篇博客以tf.keras.activations中提供的激活函数为基础,对..._tf.keras.activations.relu自定义

训练日志关于速度-程序员宅基地

cudnn.benchmark=True 将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景是网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)是不变的,其实也就是一般情况下都比较适用。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。作者:xiaopl链接:https://zhuanlan.zhihu.com/p/73711222单个Epoch速度

《计算机文化基础》课程作业答案,年7月《计算机文化基础》课程考试作业考核试题答案.pdf..._瘦大的博客-程序员宅基地

答案 我名字++答案 我名字2019 7传媒 2019 年 7 月 《计算机文化基础》课程考试作业考核试题传媒 年 月 《计算机文化基础》课程考试作业考核试题100 --总分:100 分 时间:--总分: 分 时间:答题中答题中25 50一、单选题共 25 题,50 分一、单选题共 题, 分1122 分分微型计..._计算机文化基础邓凯英答案

黑马程序员_JAVA注解学习笔记_黑马程序员注解笔记-程序员宅基地

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------一、注解部分1、注解(Annotation):一个注解本质上是一个类。2、JDK基本注解(3个):@SuppressWarnings("deprecation")://压缩"过时"@Deprecated://声明_黑马程序员注解笔记