`
xiaoyaocai
  • 浏览: 38571 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

类之间的关系(转载)

阅读更多

网上关于此类的讨论非常多,发现对于该问题的理解各有各的说法,而各个说法中又相去甚远。通过浏览这些讨论以及对《O'Reilly - UML 2.0 In A Nutshell (2007)》的参考,发表一下自己的看法

类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。

纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。

横向关系较为微妙,按照UML的建议大体上可以分为四种:

  1. 依赖    (Dependency)
  2. 关联    (Association)
  3. 聚合    (Aggregation)
  4. 组合    (Composition)

它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合

然而它们四个之间的差别却又不那么好拿捏,需要好好体会。

  1. 依赖
    • UML表示法:虚线 + 箭头 
    • 关系:" ... uses a ..."
    • 此关系最为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。
    • 典型的例子很多,比如:
      class Human
      {
          public void breath()
          {
              Air freshAir = new Air();
              freshAir.releasePower();
          }
          public static void main()
          {
              Human me = new Human();
              while(true)
              {
                  me.breath();
              }
          }
      }

      class Air
      {
          public void releasePower()
          {
              //do sth.
          }
      }
       
    • 释义:一个人自创生就需要不停的呼吸,而人的呼吸功能之所以能维持生命就在于吸进来的气体发挥了作用,所以说空气只不过是人类的一个工具,而人并不持有对它的引用。
  2. 关联
    • UML表示法:实线 + 箭头 
    • 关系:" ... has a ..."
    • 所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
    • 典型的例子很多,比如:
      class Human
      {
          ArrayList friends = new ArrayList();
          public void makeFriend(Human human)
          {
              friends.add(human);
          }
          public static void main()
          {
              Human me = new Human();
              while(true)
              {
                  me.makeFriend(mySchool.getStudent());
              }
          }

    • 释义:人从生至死都在不断的交朋友,然而没有理由认为朋友的生死与我的生死有必然的联系,故他们的生命期没有关联,我的朋友又可以是别人的朋友,所以朋友可以共享。
  3. 聚合:  
    • UML表示法:空心菱形 + 实线 + 箭头 
    • 关系:" ... owns a ..."
    • 聚合是强版本的关联。它暗含着一种所属关系以及生命期关系。被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系。
    • 典型的例子很多,比如:
      class Human
      {
          Home myHome;
          public void goHome()
          {
              //在回家的路上
              myHome.openDoor();
              //看电视
          }
          public static void main()
          {
              Human me = new Human();
              while(true)
              {
                  //上学
                  //吃饭
                  me.goHome();
              }
          }
      }
       
    • 释义:我的家和我之间具有着一种强烈的所属关系,我的家是可以分享的,而这里的分享又可以有两种。其一是聚合间的分享,这正如你和你媳妇儿都对这个家有着同样的强烈关联;其二是聚合与关联的分享,如果你的朋友来家里吃个便饭,估计你不会给他配一把钥匙。
  4. 组合
    • UML表示法:实心菱形 + 实线 + 箭头 
    • 关系:" ... is a part of  ..."
    • 组合是关系当中的最强版本,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命期的关系。被包含的对象还可以再被别的对象关联,所以被包含对象是可以共享的,然而绝不存在两个包含对象对同一个被包含对象的共享。
    • 典型的例子很多,比如:
      class Human
      {
          Heart myHeart = new Heart();
          public static void main()
          {
              Human me = new Human();
              while(true)
              {
                  myHeart.beat();
              }
          }
      }
    • 释义:组合关系就是整体与部分的关系,部分属于整体,整体不存在,部分一定不存在,然而部分不存在整体是可以存在的, 说的更明确一些就是部分必须创生于整体创生之后,而销毁于整体销毁之前。部分在这个生命期内可以被其它对象关联甚至聚合,但有一点必须注意,一旦部分所属 于的整体销毁了,那么与之关联的对象中的引用就会成为空引用,这一点可以利用程序来保障。心脏的生命期与人的生命期是一致的,如果换个部分就不那么一定, 比如阑尾,很多人在创生后的某个时间对其厌倦便提前销毁了它,可它和人类的关系不可辩驳的属于组合。
      在UML中存在一种特例,就是允许被包含对象在包含对象销毁前转移给新的对象,这虽然不自然,但它给需要心脏移植的患者带来了福音。

分享到:
评论

相关推荐

    转载 :基于神经网络的分类决策树构造

    类结果之间的关系,进而通过提取各属性与分类结果之间的导数关系来建立分类决策树。给出了具体的决策树构造算 法。同时为了提高神经网络所隐含关系的提取效果,提出了关系强化约束的概念并建立了具体的模型。实际...

    购物网站满意度与冲动购买行为的关系

    购物网站满意度与冲动购买行为的关系,属于论文模式

    MATLAB中用imshow显示图像与图像的数据类型的关系-SN.m

    MATLAB中用imshow显示图像与图像的数据类型的关系-SN.m (此为本人从CSDN上转载,因前半部分解决了偶的问题,故觉得有些价值,特此奉上。)  在matlab中,我们常使用imshow,我们会发现显示的是一个白色的图像。...

    地学基础(转载)

    地图的数学基础,是指使地图上各种地理要素与相应的地面景物之间保持一定对应关系的经纬网、坐标网、大地控制点、比例尺等数学要素。 &lt;br&gt;为了解地图上这些数学要素是怎么建立起来的,首先必须搞清楚地球是一个...

    MongoDB新人自学

    MongoDB [2] 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    3.3 接口与接口之间的关系 一个接口可以使用extends关键字去继承一个或多个已有的接口,但在子类的实现时,也必须全部实现所有接口的抽象方法. 一个接口去继承并实现多个接口的例子如下: view plaincopy to ...

    数据降维的处理工作接触到drtoolbox工具箱

    线性降维是指通过降维所得到的低维数据能保持高维数据点之间的线性关系。线性降维方法主要包括PCA、LDA、LPP(LPP其实是LaplacianEigenmaps的线性表示);非线性降维一类是基于核的,如KPCA,此处暂不讨论;另一类...

    C语言初阶-(单向链表)

    用单链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的,指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,由此,这种存储结构为非顺序映像或链式映像。...

    Unicode ANSI中一些宏的解释

    关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L(转载) CString ,BSTR ,LPCTSTR之间关系和区别 (转载)

    unityStrangeIoc

    信号是框架内另外一种通信主线,它采用强类型,来绑定信号和命令之间的关系,实现消息响应的触发 9.ReflectionBinder 反射部分,通过binding来获取类的信息,存储在ReflectedClass中 10.injector 注入器,通过反射...

    数据相关性分析方法.pdf

    相关系数(Correlation coefficient)是反应变量之间关系密切程度的统计指标,相关系数的取值区间在1 到-1之间。1表⽰两个变量完全线性相关,-1表⽰两个变量完全负相关,0表⽰两个变量不相关。数据越趋近于0表⽰相关...

    ChatGPT的原理(简单概述)

    Transformer是一个由深度神经网络组成的多层网络,其模型的结构类似于神经元,Transformer 模型主要分为两大部分,分别是 Encoder 和 Decoder,建立了词与词之间的复杂关系,其参数之多,可以说其本身的语言模型已经...

    我国GIS软件的发展现状

     GIS针对特定的应用任务,存储事物的空间数据和属性数据,记录事物之间的关系和演变过程。它可根据事物的地理坐标对其进行管理、检索、评价、分析、结果输出等处理,提供决策支持、动态模拟、统计分析、预测预报等...

    max261PDF资料

    转载,希望对大家有帮助 要制作一程控滤波器,其滤波...这5个参数之间是有相互关系的,计算起来很复杂,为了提高设计效率可用MAXIM公司为MAX261滤波器提供的专用设计软件来计算。在计算f0和Q时应选择不同的工作模式。

    原创优先的搜索引擎排序算法

    :现有的搜索引擎排序算法大多根据网页之间的链接关系进行排序,没有考虑原创和转载文章之间的优先次序。该文提出一种适用于专业搜索引擎的新型排序算法,在排序时优先考虑原创文章,使原创文章的搜索排名得以提高,...

    计算机二级C语言考试题预测

    模块之间的调用关系 C. 数据的流向 D. 程序的组成成分 (59) SQL语言又称为(C) A. 结构化定义语言 B. 结构化控制语言 C. 结构化查询语言 D. 结构化操纵语言 (60) 视图设计一般有3种设计次序,下列不属于视图设计的...

    K8 SEO全能营销 2559网页采集器,发贴器

    软件功能有: ...9.Email营销(STL/SSL)拉近您和网站会员之间的关系; 10.强大的站群让你体会那高级推广功能 11.智能识别,让您简单上手 12.可视化采集规则编写+抓包发布规则,配合P语言,让您精准采集/发布;

    8大特性参数让您快速了解高频变压器

    变压器铁芯损耗与频率关系很大,故应根据使用频率来设计和使用,这种频率称工作频率。 2、额定功率 在规定的频率和电压下,变压器能长期工作,而不超过规定温升的输出功率。 3、额定电压 指在变压器的线圈上所...

    node.js.zip

    Spring SpringMVC SpringBoot以及SpringCloud之间存在什么样的关系? SpringBoot中如何解决跨域问题 SpringBoot打成的jar和普通的jar有什么区别? SpringBoot内嵌了哪些web容器,区别是什么,内嵌容器的优点是什么...

    大数据的存储和管理.pdf

    ⼤数据的存储和管理 也欢迎⼤家转载本篇⽂章。分享知识,造福⼈民,实现我们中华民族伟⼤复兴! ⼤数据的存储和管理 任何机器都会有物理上的限制:内存容量、硬盘容量、处理器速度等等,我们需要在这些硬件的限制和...

Global site tag (gtag.js) - Google Analytics