目录

一、UML统一建模语言简介

二、类图

三、类与类之间的关系

1. 泛化关系

2. 实现关系

3.  依赖关系

4. 关联关系

5. 聚合关系

6. 组合关系

四、小结


一、UML统一建模语言简介

在软件开发流程中,一般应先对软件开发的过程进行建模,把要做什么功能、如何去实现、达到什么样的程度这些基本问题分析清楚了,才去写代码实现。建模是对现实按照一定规则进行简化,但应该体现出现实事物的特点。通过软件建模可以把现实世界中的问题转化到计算机世界进行分析和实现,软件建模的实现过程就是需求-建模-编码的一个过程。

UML统一建模语言,United Modeling Language,是一种面向对象的可视化建模语言,通过图形符号描述现实系统的组成,通过建立图形之间的关系来描述整个系统模型。

二、类图

类图是面向对象系统建模中最常用的一种UML图,主要用来表示类与类之间的关系,包括泛化关系、关联关系、依赖关系和实现关系。

类图由三部分组成:类名、属性和方法。

-   表示private

+   表示public

#   表示protected

点击选择类组件就可以进行设置,可以直接在组件上修改,也可以在右侧Editors修改。

  • 属性表示为          属性名:类型
  • 方法表示为          方法名(参数类型):返回值类型

三、类与类之间的关系

1. 泛化关系

Generalization,用来表示类与类之间的继承关系,也叫做is a kind of关系,用三角形的箭头从子类指向父类。

2. 实现关系

Realization,实现关系就是类或接口的实现,由三角箭头虚线从实现类指向接口类,(比如C++中纯虚函数的实现)。可以在右侧查看类之间的关系。

3.  依赖关系

Dependency,依赖关系是指在一个类中要用到另一个类的实例的一种关系,主要表现为一个类是另一个类的函数参数,或者一个类是另一个类的函数返回值的情况。在类图中的表现形式为一个虚线箭头从一个类指向被依赖的类。

具体代码表现形式为

class Class4 {};
class Class3
{
public:void function(Class4 temp) //Class4类对象作为Class3的成员函数的函数参数{    /**/  }
};

4. 关联关系

Association,关联关系是类和类之间对应的一种连结,是指两个独立的对象,一个对象的实例与另一个对象的一些特定实例存在固定的对应关系。关联关系可以是单向的也可以是双向的,通过关联使得一个类可以使用另一个类的属性和方法,在C++中具体的表现形式为,一个类的对象是另一个类的成员属性。在类图中,单向的是带箭头的实线,双向的是不带箭头的实线。

代码形式为

class Class6 {};
class Class5
{
public:void func(){c.func1(); //可以直接使用Class6的方法}
private:Class6 c; //Class6对象作为Class5类的成员属性
};

5. 聚合关系

Aggregation,聚合关系表示整体和部分的关系,它是一种has-a的包含关系,而且整体和部分是可以分离的,即离开整体,部分也能存在。聚合关系是关联关系的一种,它是一种更强的关联关系。聚合关系在C++中的表现也是成员变量的方式,但是和关联关系不同的是,关联关系中的两个类是相互独立的,而聚合关系中的两个类是整体与部分的关系,一个类是另一个类的一部分。在类图中,空心菱形在代表整体的类那侧,另一侧为代表部分的类。

聚合关系的简单理解,比如手机和充电线,充电线是手机的一部分,手机就是整体,充电线是部分,但是没有手机了,充电线也可以单独存在。代码表现形式为:

class charger {};
class phone
{
public:void set_charger(charger m_c){this->m_c = m_c;}
public:charger m_c;
};

在聚合关系中,我们在创建一个对象phone的时候可以不去管charger,因为在phone类中定义了set_charger方法用于构造charger,我们可以通过该方法在其它时机设置charger。

6. 组合关系

Composite,也是关联关系的一种,是一种比聚合关系更强的关联关系。如果两个类是聚合关系(A是B的一部分),那么离开B之后,A就失去了存在的意义。组合关系是一种不可分离的关系。在类图中用实心菱形指在代表整体的类,另一侧为代表部分的类。

聚合关系的简单理解,屏幕screen是手机phone的一部分,并且屏幕screen离开手机phone之后就失去了存在的意义,这就是组合关系。代码表现形式为:

class screen {};
class phone
{
public:phone(screen m_s){this->m_s = m_s;}
public:screen m_s;
};

在组合关系中,创建phone对象的时候就已经构造了属性m_s,也就是整体phone的生命周期也决定了部分screen的生命周期,一旦phone生命周期结束了,screen的生命周期也结束了。在聚合关系中,没有这种强的生命周期的关联。

四、小结

对6种类与类之间的关系进行总结对比:

  • 泛化关系和实现关系的区别:泛化关系是指C++中的继承关系;而实现关系是指虚基类的继承,在子类中实现虚基类的纯虚函数。
  • 泛化关系和实现关系可以看成依赖关系的一种,因为它们离开依赖的类都无法编译通过。
  • 聚合关系和组合关系是关联强度逐渐增强的关联关系;关联关系双方是平等的,聚合关系和组合关系的双方是整体和部分的关系。
  • 聚合关系的双方整体和部分可以分离单独存在,没有生命周期的强相关;组合关系双方,部分离开整体将失去意义,整体的生命周期代表了部分的生命周期。

【设计模式学习笔记】类图:类与类之间的关系相关推荐

  1. 我的学习笔记005--常见web前台技术之间的关系html,css,javascript...mxx

    在网上浏览到这篇博客本来想自己总结但是发现人家写的已经想当好了,让我想精简也无法精简那就挑选我认为重点的东西赋值粘贴 过来 如果你是一个Web开发初学者,那么你难免会在网上搜索HTML, CSS, X ...

  2. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  3. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段

    Kotlin 学习笔记(七)-- Kotlin类与对象之属性与字段 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- ...

  4. Python学习笔记(九):类和对象

    Python学习笔记(九):类和对象 关于类和对象 Python学习笔记(九):类和对象 一.类和对象 类的定义 类的实例化 类对象的使用 二.self用法 三.类方法 实例方法 类方法 静态方法 静 ...

  5. PyTorch学习笔记(六)——Sequential类、参数管理与GPU

    系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...

  6. UML类图简介及类与类之间的关系

    UML(Unified Modeling Language,统一建模语言)建模是面向对象开发设计方法中的第一步,用UML来表达设计模式不仅方便了开发人员的交流,而且更加清晰.准确.UML定义了5类10 ...

  7. 设计模式学习笔记1——概述 UML图 软件设计原则

    目录 1.设计模式概述 1.1.软件设计模式产生背景 1.2.软件设计模式概念 1.3.学习设计模式的必要性 1.4.设计模式分类 1.4.1.创建型模式 1.4.2.结构型模式 1.4.3.行为型模 ...

  8. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  9. 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析

    什么是面向对象 在目前的软件开发领域有两种主流的开发方法,分别是结构化开发方法和面向对象开发方法.早期的编程语言如C.Basic.Pascal等都是结构化编程语言,随着软件开发技术的逐渐发展,人们发现 ...

最新文章

  1. C#零碎知识点笔记(容易混淆的一些点)
  2. 关机相关(shutdown,reboot)
  3. RMAN无法删除归档日志
  4. 超图数据集管理基本操作 - 隐藏系统字段和添加字段索引
  5. IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构
  6. 宝塔mysql远程链接_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案
  7. 两点定标法_一种两点校正红外热像仪的非均匀性的模块及方法
  8. 光栅图形学算法基础其三 (消隐算法)
  9. 领导力十律_关于开放领导力的10个最受欢迎的故事
  10. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)
  11. k3服务器端的虚拟,k3服务器 客户端配置
  12. linux挂载lvm
  13. linux安装steam
  14. 简单无须Root 谷歌相机Gcam 打开即闪退的解决方法
  15. win11系统管理员身份在哪里?怎么设置
  16. 5G China unicom 一般性异常处理
  17. IIC-LED-AW9120--1原理准备(基于麒麟座)
  18. [CTF] 攻防世界MISC高手区部分题目WriteUp(2)
  19. Java小白的入门面试笔记--线程局部变量之灵魂四问
  20. Redis数据类型有哪些?

热门文章

  1. python3图片进行base64编码与解码
  2. 如何获取网页真实地址
  3. tushare pro的token凭证码设置教程详解
  4. 操作系统思维导图(一)
  5. Lycn 2013 with SQL AlwaysOn 「二」偷梁换柱装Lync
  6. 移动端SEO优化指南:详解移动站点收录、排名规则
  7. PMP笔记-产品核实、范围核实及质量控制的区别
  8. cmd如何切换到E盘
  9. ssm基于Java的微小企业人事管理系统的设计与实现毕业设计源码231012
  10. 855 AIMA学习笔记(by菜菜子)