转载:认识UML类关系——依赖、关联、聚合、组合、泛化

2023-05-16

文章目录

  • 1.依赖(Dependency)
  • 2.关联(Association)
  • 3.聚合(Aggregation)
  • 4.组合(复合,Composition)
  • 5.泛化(Generalization)
  • 6.小结
  • 参考文献

在学习面向对象设计时,类关系涉及依赖、关联、聚合、组合和泛化这五种关系,耦合度依次递增。关于耦合度,可以简单地理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强。

下面根据个人理解,尝试讲解这五种类关系。

1.依赖(Dependency)

依赖关系使用虚线加箭头表示,如下图所示:
这里写图片描述

学生在学习生活中经常使用电脑,于是对电脑产生了依赖。依赖关系是五种关系中耦合最小的一种关系。类A要完成某个功能引用了类B,则类A依赖类B。依赖在代码中主要体现为类A的某个成员函数的返回值、形参、局部变量或静态方法的调用,则表示类A引用了类B。以Student类和Computer类为例,用C++语言编码如下:

class Computer
{
public:
	static void start(){
		cout<<"电脑正在启动"<<endl;
	} 
};
class Student
{
public:
	//返回值构成依赖
	Computer& program();
	//形参构成依赖
	void program(Computer&);
	void playGame()
	{
		//局部变量构成依赖
		Computer* computer=new Computer;
		...
		//静态方法调用构成依赖
		Computer::star();
	}
};

   
   
   
   

    2.关联(Association)

    关联关系使用实线加箭头表示,类之间的关系比依赖要强。学生与老师是关联的,学生可以不用电脑,但是学生不能没有老师。如下图所示:
    这里写图片描述

    关联与依赖的对比:
    相似之处:
    关联暗示了依赖,二者都用来表示无法用聚合和组合表示的关系。

    区别:
    (1)发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。

    发生关联关系的两个类,类A成为类B的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。 在代码中的表现如下:

    class Teacher;
    class Student{
    public:
    	Teacher teacher;  //成员变量
    	void study();
    }	
    
       
       
       
       

      (2)从关系的生命周期来看,依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束。关联关系当类实例化的时候产生,当类对象销毁的时候关系结束。相比依赖,关联关系的生存期更长。

      关联关系有单向关联、双向关联、自身关联、多维关联等等。其中后三个可以不加箭头。
      单向关联:
      这里写图片描述

      双向关联:
      这里写图片描述

      自身关联:
      这里写图片描述

      多维关联:
      这里写图片描述

      3.聚合(Aggregation)

      聚合关系使用实线加空心菱形表示。聚合用来表示集体与个体之间的关联关系。例如班级与学生之间存在聚合关系,类图表示如下:
      这里写图片描述

      聚合关系在代码上与关联关系表现一致,类Student将成为类Classes的成员变量。代码如下:

      class Student;
      class Classes{
      public:
          Student* student; 
      	Classes(Student* stu):student(stu){}
      };
      
         
         
         
         

        4.组合(复合,Composition)

        复合关系使用实线加实心菱形表示。组合又叫复合,用来表示个体与组成部分之间的关联关系。例如学生与心脏之间存在复合关系,类图表示如下:
        这里写图片描述

        组合关系在代码上与关联关系表现一致,类Heart将成为类Student的成员变量。代码如下:

        class Heart;
        class Student
        {
        public:
            Heart* heart; 
        	Student()
        	{
        		heart=new Heart;
        	}
        	~Student()
        	{
        		delete heart;
        	}
        };
        
           
           
           
           

          聚合与组合的对比:
          (1)聚合关系没有组合紧密。
          学生不会因为班级的解散而无法存在,聚合关系的类具有不同的生命周期;而学生如果没有心脏将无法存活,组合关系的类具有相同的生命周期。

          这个从构造函数可以看出。聚合类的构造函数中包含另一个类的实例作为参数,因为构造函数中传递另一个类的实例,因此学生可以脱离班级体独立存在。组合类的构造函数包含另一个类的实例化。因为在构造函数中进行实例化,因此两者紧密耦合在一起,同生同灭,学生不能脱离心脏而存在。

          (2)信息的封装性不同。
          在聚合关系中,客户端可以同时了解Classes类和Student类,因为他们是独立的。

          在组合关系中,客户端只认识Student类,根本不知道Heart类的存在,因为心脏类被严密地封装在学生类中。

          理解聚合与复合的区别,主要在于聚合的成员可独立,复合的成员必须依赖于整体才有意义。

          5.泛化(Generalization)

          泛化是学术名称,通俗来讲,泛化指的是类与类之间的继承关系和类与接口之间的实现关系。

          继承关系使用直线加空心三角形表示。类图结构如下:
          这里写图片描述
          类接口的实现关系使用虚线加空心三角形表示。类图结构如下:
          这里写图片描述

          6.小结

          依赖、关联、聚合、组合与泛化代表类与类之间的耦合度依次递增。依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,组合是一种更强的关联,泛化则是一种最强的关联,所以笼统的来区分的话,实际上这五种关系都是关联关系。

          依赖关系比较好区分,它是耦合度最弱的一种,在编码中表现为类成员函数的局部变量、形参、返回值或对静态方法的调用。关联、聚合与组合在编码形式上都以类成员变量的形式来表示,所以只给出一段代码我们很难判断出是关联、聚合还是组合关系,我们需要从上下文语境中来判别。关联表示类之间存在联系,不存在集体与个体、个体与组成部分之间的关系。聚合表示类之间存在集体与个体的关系。组合表示个体与组成部分之间的关系。

          依赖、关联、聚合与组合是逻辑上的关联,泛化是物理上的关联。物理上的关联指的是类体的耦合,所以类间耦合性最强。


          参考文献

          [1] 认识UML中类之间的依赖、关联、聚合、组合、泛化的关系
          [2] UML类关系(依赖,关联,聚合,组合的区别)
          [3] 原文链接
          [4] 谈一谈自己对依赖、关联、聚合和组合之间区别的理解

          本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

          转载:认识UML类关系——依赖、关联、聚合、组合、泛化 的相关文章

          • 最好的生活方式:存钱,运动,读书,早起

            想一想 xff0c 这是不是你的日常 xff1a 明知道跑步能健身 xff0c 却始终迈不开腿 xff1b 嘴上说存钱 xff0c 却还在疯狂购物 xff1b 阅读计划做了一堆 xff0c 却总是安慰自己 xff1a 明天再开始吧 xff1
          • 【业务测试】

            业务测试疑问 xff1a 你觉得业务测试就是点点点吗 xff1f 你觉得业务测试就是依据需求设计case并全部执行通过就OK了吗 xff1f 你觉得业务测试就是功能测试 43 兼容测试 43 性能测试 43 接口测试 43 自动化吗 xff
          • selenium之如何定位iframe中的元素

            今天想写个126邮箱自动化登录脚本 xff0c 由于id是动态的 xff0c name也获取不到 xff0c 最后通过查看页面发现是写在iframe中 xff0c 所以要先获取表单 xff0c 在获取表单中的元素 xff0c 代码如下 xf
          • 无法连接虚拟机网络的情况之---Vmnet8 Net网络连接方式

            最近一直在虚拟机win7系统完loadrunner 昨晚突然想连接linux系统 xff0c 但是发现链接不上之前搭建的集群主机 xff0c 在linux服务器也能ping通www baidu com 但是在宿主机secureCRT链接不到
          • select * from .... for update 使用

            今天看到同事在群里发for update的sql 初步了解下 xff01 解释 xff1a for update是在数据库中上锁用的 xff0c 可以为数据库中的行上一个排它锁 当一个事务的操作未完成时候 xff0c 其他事务可以读取但是不
          • 基于NotePad应用做功能扩展

            写在前面 xff0c 解决图片不能查看问题 因为有 墙 的存在 xff0c DNS污染了 xff0c 存在不能查看GitHub上图片问题 配置hosts文件 xff0c 直接指向github的服务器 用ipaddress查一下GitHub
          • Windows 7 镜像下载汇总

            Windows 7 官方原版操作系统 下载说明 xff1a 请右击迅雷下载或者开启迅雷 xff0c 然后复制地址迅雷会自动检测到 Windows 7 官方原版光盘镜像32位旗舰版下载地址 下载地址 xff1a 2 43GB ed2k fil
          • navicat连接虚拟机数据库

            连接服务器 mysql u root p 查看当前所有数据库 xff1a show databases 进入mysql数据库 xff1a use mysql 查看mysql数据库中所有的表 xff1a show tables 查看user表
          • web综合题(2)

            一 选择题 1 下列关于HTML中的CSS样式表的说法正确的是 xff08 C xff09 A CSS样式表的基本选择器有 xff1a 标记选择器 Id选择器和类选择器及后代选择 器 B CSS样式表仅具有继承性 C 对于定义样式div p
          • ubuntu20.04系统出现 仓库 “http://ppa.launchpad.net/fcitx-team/nightly/ubuntu xenial Release“ 没有Release文件

            我们进行 sudo apt get update 时 出现仓库 http ppa launchpad net fcitx team nightly ubuntu 有文件但是不能安装的问题 我看了很多文章 xff0c 也逐个试了没有得到很好的
          • 关于如何关闭项目里的Tortoise Git

            今天遇到了这个问题 xff0c 搜了一圈没找到相关的解决方法 xff0c 最后找到方法之后 xff0c 感觉自己就像个傻子 xff0c 这么简单的方法都没想到 解决方法如下 xff1a 只需要把图中最上方的 git 文件夹删掉就可以了 删掉
          • ES6之Module 的加载实现(1)

            1 浏览器加载 1 1传统方法 xff1a 在 HTML 网页中 xff0c 浏览器通过 lt script gt 标签加载 JavaScript 脚本 默认情况下 xff0c 浏览器是同步加载 JavaScript 脚本 xff0c 即渲
          • 我的2013年终总结——在苦与乐中成长

            写在前面 最近正好在三亚旅游 xff0c 空闲下来时 xff0c 便开始进行年终总结 由于去年年末较忙 xff0c 便错过了2012 年的年终总结 xff0c 所以本文将会对 2012 与 2013 两年一起进行总结 说说工作 学生 到 码
          • 走过2014,2015我将继续前行

            写在前面 一转眼 xff0c 一年时光就这么溜走了 在这辞旧迎新之际 xff08 这说法是不是很官方啊 xff0c 呵呵 xff01 xff09 xff0c 我将对即将过去的2014 年进行一番总结 xff0c 并对即将来临的 2015 年
          • 教程 | ROS中Gazebo版本升级更新以及环境太暗解决方案

            1 Gazebo升级 使用下列代码可将gazebo升级为该版本的最新版 xff0c 适用于gazebo7与gazebo9 添加源 sudo sh c 39 echo 34 deb http packages osrfoundation or
          • EKF_SLAM一般过程

            SLAM xff0c 同步定位与地图构建 xff0c 本文将介绍基于EKF的SLAM的整体过程 1 EKF SLAM Overview 当机器人处在个未知环境中时 xff0c 他最想知道的就是他在当前环境中的位置 环境不知道咋办 xff0c
          • 0.1+0.2 为什么不等于0.3

            目录 一 0 1 43 0 2的计算过程 1 十进制转成二进制 2 转成浮点数 3 浮点数相加 4 浮点数转成十进制 二 答案 三 拓展 一 0 1 43 0 2的计算过程 1 十进制转成二进制 在JS内部所有的计算都是以二进制方式计算的
          • 一起重新开始学大数据-hadoop篇-Day45-hdfs解析和zookeeper安装

            一起重新开始学大数据 hadoop篇 Day45 hdfs解析和zookeeper安装 hadoop启动脚本 详细启动脚本介绍 第一种 xff1a 全部启动集群所有进程 启动 xff1a sbin start all sh 停止 xff1a
          • arduino上ESP8266用Adafruit_SSD1306库驱动OLED屏

            关注 星标公众号 xff0c 不错过精彩内容 编辑 xff1a Tony 来源 xff1a 公众号TonyCode 在进行后续的ESP8266学习前 xff0c 我们先来对OLED屏进行驱动 xff0c 为后续学习提供直观的信息显示 1 安
          • Centos7 虚拟机无法上网,并且不能ping通主机,但是主机可以ping通虚拟机

            我在VM中安装了一个 CentOS 7 系统 xff0c 可是用 NAT 模式 只能宿主机ping通虚拟机 xff0c 虚拟机却ping不能宿主机 原因 xff1a VMnet8中的ipv4地址和WLAN无线网卡的ipv4地址冲突了 修改V

          随机推荐