UML类图五种关系与代码的对应关系

UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承

一、依赖关系:

(一)说明

虚线+箭头

可描述为:Uses a

依赖是类的五种关系中耦合最小的一种关系。

因为在生成代码的时候,这两个关系类都不会增加属性

(二)依赖关系图与代码的对应关系


PS:依赖关系:Animal依赖于Water(动物依赖于水))

[csharp] view plaincopyprint?
  1. Public class Animal()  
  2. {  
  3.         Public Animal(){}  
  4. }  
  5.   
  6. Public class Water()  
  7. {  
  8.         public Water(){}  
  9. }  
          可以看到生成的两个类的代码中什么都没有添加

(三)思考:

Animal类如何使用Water类呢?或者说依赖关系到底是如何体现的呢?

1、表现形式1

Water类是全局的,则Animal类可以调用它

2、表现形式2

Water类是 Animal类的某个方法中的变量,则Animal类可以调用它。

[csharp] view plaincopyprint?
  1. Public class Animal {  
  2.       Public void Grownup() {  
  3.                Water water =null;  
  4.       }  
  5. }  

注意1 Water类的生命期,它是Animal类的GrounUp方法被调用的时候,才被实例化

注意2持有Water类的是Animal的一个方法而不是Animal,这点是最重要的!

3、表现形式3

Water类是作为Animal类中某个方法的参数或者返回值 

[csharp] view plaincopyprint?
  1. Public Animal {  
  2.    Public Water Grownup(Waterwater) {  
  3.               return null;  
  4.       }  
  5. }  

注意:   Water类被Animal类的一个方法持有。生命期随着方法的执行结束而结束

 

二、关联关系

(一)说明

实线+箭头

可描述为:Has a

关联关系用实线,表示类之间的耦合度比依赖强

在生成代码的时候,关联关系的类会增加属性。

(二)关联关系与代码的对应关系

      

           PS:Water类与Climate类关联(水与气候关联)。 

[csharp] view plaincopyprint?
  1. Public classWater {  
  2.      public Climate m_Climate;  
  3.      public Water(){}  
  4. }  
  5.    
  6. Public class Climate {  
  7.      public Climate() {}  
  8. }  
可见生成的代码中,Water类的属性中增加了Climate类。

(三)关联关系的种类

关联既有单向关联又有双向关联。

1、单向关联: Water类和Climate类单向关联(如下图),则Water类称为源类,Climate类称为目标类。源类了解目标类的所有的属性和方法,但目标类并不了解源类的信息。

        

2、双向关联:源类和目标类相互了解彼此的信息。如将Water类和Climate类之间改为双向关联。


[csharp] view plaincopyprint?
  1. Public class Water {  
  2.     public Climate m_Climate;  
  3.     public Water(){}  
  4. }  
  5. Public class Climate {  
  6.     public Water m_Water;  
  7.     public Climate() {}  
  8. }  

可见生成的代码中,两个类的属性都添加了!


(四)思考:

依赖关系和关联关系的区别在哪里?

1、从类的属性是否增加的角度看

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

  2)发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。

2、从关系的生命期角度看:

  1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。

  2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。

(五)关联关系的细化:聚合、组合

1、说明

1)聚合关系,用空心菱形加箭头表示

2)组合关系,用实心菱形加箭头表示,类之间的耦合关系比聚合强!

2聚合和组合都是关联关系的一种,到底如何区分二者呢?

1)聚合和组合生成的代码


         (PS:此图表明雁群类是由大雁类聚合而成)

[csharp] view plaincopyprint?
  1. Public classGooseGroup {  
  2.     public Goose goose;  
  3.     Public GooseGroup(Goose goose) {  
  4.               this.goose = goose;  
  5.        }  
  6. }  
    

        (PS:此图表明大雁类是由翅膀类组合而成)

[csharp] view plaincopyprint?
  1. Public classGoose {  
  2.    public Wings wings;  
  3.    public Goose() {  
  4.        wings = new Wings();  
  5.     }  
  6. }  

2构造函数不同

          聚合类的构造函数中包含了另一个类作为参数。 雁群类(GooseGroup)的构 造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在。

         组合类的构造函数中包含了另一个类的实例化。 表明大雁类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。翅膀类(Wings)是不可以脱离大雁类(Goose)而独立存在。

3信息的封装性不同。

         在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的。

         在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

 

三、泛化

(一)说明

实线+箭头

可描述为:Is a

泛化也称继承,子类将继承父类的所有属性和方法,并且可以根据需要对父类进行拓展。

(二)泛化关系与代码的对应关系


PSBird类继承Animal类,鸟是一种动物)

[csharp] view plaincopyprint?
  1. Class  Bird :Animal{  
  2. }  

(三)思考:

1子类继承父类,真的是继承了父类的所有属性和方法吗?

      子类确实是继承了父类的所有属性和方法,只是对于父类的私有类型成员没有访问权限!访问就会报错!

2泛化和继承是一回事儿吗?

      子类继承父类,父类泛化子类。 这两个词是从不同的角度来说的! 

3为什么要多用组合少用继承?

       继承和组合各 有优缺点。

       类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口,而且,对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。

 

四、实现关系

       虚线+箭头


     (PSWideGoose类实现IFly接口。大雁实现飞翔的接口)

[csharp] view plaincopyprint?
  1. Class WideGoose:Ifly{   
  2. }  

实现关系重点理解接口的定义

    接口interface),接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 rapidxml 做配置文件

对于配置文件&#xff0c;一般会选用ini,xml 等等的配置格式。如何快速高效的从文件内读取自己想要的信息是每个做配置文件想要达到的效果。对以小型开发我们并不用时用到msxml这种重量级的解析器。那样会给自己添麻烦的。这里我推荐大家使用rapidxml。 之前使用tinyxml 感觉还…

水晶报表实现(一)

WINFORM下创建水晶报表&#xff1a; 1、新建一个“windows应用程序” 2、添加一个数据集&#xff08;.xsd&#xff09;文件&#xff0c;它是ADO.NET数据集&#xff0c;数据集用于在断开缓存中存储数据&#xff0c;它的结构类似于关系数据库的接口&#xff0c;它公开表、行和列的…

Java swing 实现下拉框和文本框同步显示

想要MyEclipse中的swing中实现下拉框和文本框实现&#xff0c;对下拉框创建MouseEvent、ItemEvent、ActionEvent private void xingbieMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: setSelectedItem(evt, this.xingbie1); } private v…

python image 转成字节_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍

选自TowardsDataScience作者&#xff1a;George Seif本文转自机器之心(nearhuman2014)本文可以教你仅使用 3 行代码&#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言&#xff0c;它易于使用&#xff0c;也有很多出色的库来帮助你更快处理数据。但…

LSGO软件技术团队内部技术交流【2015-2016(1)第七周】

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

汉字区位码对照表

汉字区位码对照表 a-beibei--cancan-chichi-dada-dongdong-feifei-gege-guoha-huanhuan-jiajia-jingjing-kaokao-langlang-linlin-maimai-momo-nunu-pingping-qieqie-rongrou-shenshen-sisong-titi-weiwei-xiaxia-xuxu-yeye-youyou-zaozao-zhizhi-zizong-zuo 附&#xff1a; 0…

有点憋,说两句

还是QQ和360的那点事。 曾经一度&#xff0c;几年前吧&#xff0c;我也很不喜欢腾讯&#xff0c;觉得它仗着自己在国内即时通讯方面的垄断&#xff0c;不好好做产品&#xff0c;尽想着赚钱。总觉得它在想方设法的勾引你用自己的人民币去换成Q币。总觉得用真正的高素质的网民是用…

C语言程序设计(代码+知识点)

本文章包括C语言基本知识点和代码,部分题代码有多种解法,包括作者一开始的想法,代码都为调通可运行程序。 文章包括12章内容,参考书籍《C语言程序设计》,参考视频小甲鱼 可以边学习知识点边看代码,结合学习效率更高 /*#include <stdio.h> void main() {printf(&…

python beautiful soup 标签完全相同_Python爬取Python教程并制作成pdf

欢迎点击右上角关注小编&#xff0c;除了分享技术文章之外还有很多福利&#xff0c;私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。想要把教程变成PDF有三步&#xff1a;1、先生成空html&#xff0c;爬取每一篇教程放进一个新生成的div&a…

LSGO软件技术团队2015~2016学年第八周(1019~1025)总结

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

vxImmrGet

*PBODR(vxImmrGet()) & 0xfcff; *PBPAR(vxImmrGet()) & 0xfffffcff; *PBDIR(vxImmrGet()) | 0x00000300; vxImmrGet()应该是获取powerpc 的IMMR(Internal Memory Mapped Registers)的值,这个寄存器保存着所有powerpc CPU寄存器所映射的内存基地址&#xff0c;PBODR&a…

ENVI计算公式(一)

<1>大于1的值赋予1&#xff0c;小于0的值赋予0 ((b1 lt 0)*(0)(b1 ge 0)*b1)or((b1 gt 1)*(1)(b1 ge 0)*b1) <2>modis数据计算ndvi b1*0.0001 <3>modis数据计算地表温度&#xff08;单位&#xff1a;摄氏度&#xff09; b1*0.02-273.15 <4>modis数据…

list取数据_Day.5利用Pandas做数据处理(二)

数据合并使用Join()合并&#xff0c;合并的方式是根据行和行进行合并。# 使用join合并&#xff0c;着重关注的是 行的合并import pandas as pd df1pd.DataFrame({Red:[1,3,5],Green:[5,0,3]},indexlist(abc))df2pd.DataFrame({Blue:[1,9,8],Yellow:[6,6,7]},indexlist(cde))pri…

小字节序和大字节序

小字节序&#xff1a;(比如x86体系) 数据的低字节放在低地址处&#xff0c;比如一个整型数0x12345678&#xff0c;在内存中的 分布为&#xff1a; ----------- | 78 | xxxx_0000 ----------- …

[轉]Flash/Flex监听浏览器的关闭事件

FROM : http://blog.ityao.com/archives/581 如果想用Flash/Flex监听浏览器的关闭事件&#xff0c;可以通过JavaScript的window.onbeforeunload事件进行监听然后JS调用Flash中的函数。在swf所在页面的JavaScript中添加如下代码JS中代码&#xff1a;&#xff08;这里设定swf文件…

MRP的数据处理-华北水利水电大学(作业)

这是之前学经济方向的同学让我利用C语言写的关于MRP的数据处理的过程&#xff0c;在用C语言写的过程中利用了动态数组使得时区不仅限于这8时区&#xff0c;有相关的同学可以进行查看 代码运行结果如下&#xff08;该代码可以自动调整参数&#xff0c;时区可以设置8天以上&#…

LSGO软件技术团队2015~2016学年第九周(1026~1101)总结

简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养…

VXWORKS 几种定时机制

编程过程中&#xff0c;出于需要&#xff0c;大家或多或少要用到定时/延时。VxWorks下提供了几种定时/延时机制&#xff0c;根据收集的一些资料和VxWorks相关文档&#xff0c;在学习和上机实验的基础上&#xff0c;对它们的使用以及我所遇到的问题做一个总结&#xff0c;希望对…

git 每次都要输入用户名密码_Git向GitHub提供代码

一.前期准备工作首先建立一个GitHub账号&#xff0c;这个账号和密码邮箱要记住&#xff0c;如果忘记了也可以找回&#xff0c;会麻烦一些。在官网下载一个Git,可以自己根据默认进行安装&#xff0c;这样也是没有问题的&#xff0c;如果系统盘的空间不够大&#xff0c;可以安装到…

C# Socket 入门5 UPD 结构体 与 C++ 通信

1. 同样&#xff0c; 我们先看看这一个比简单的 结构体 代码 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceCSharp_Socket_5{ ///<summary>///通信消息格式 ///</summary>[Serializable] …