【转】30分钟学会UML类图

转自:30分钟学会UML类图 - 知乎

30分钟学会UML类图

30分钟学会UML类图

肖继潮

       UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就能做80%的事情。对于程序员来说,最频繁使用的莫过于类图。因此,这里我们只讲解UML类图。至于其它UML图,请在以后的工作中参阅更多UML学习资料继续学习。

        类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图中最基本的元素是类、接口。软件设计师设计出类图后,程序员就可以用代码实现类图中包含的内容。

类图中具体类、抽象、接口和包的表示法

UML类图中具体类、抽象类、接口和包有不同的表示方法。

1)在UML类图中表示具体类

具体类在类图中用矩形框表示,矩形框分为三层:第一层是类名字。第二层是类的成员变量;第三层是类的方法。成员变量以及方法前的访问修饰符用符号来表示:

  • “+”表示 public
  • “-”表示 private
  • “#”表示 protected
  • 不带符号表示 default

2)在UML类图中表示抽象类

抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用斜体字表示,如图2所示。

3)在UML类图中表示接口

接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 <<interface>>表示,下面是接口的名字,第二层是方法,如图3所示。此外,接口还有另一种表示法,俗称棒棒糖表示法,就是类上面的一根棒棒糖(圆圈+实线)。圆圈旁为接口名称,接口方法在实现类中出现。

4)在UML类图中表示包

类和接口一般都出现在包中,UML类图中包的表示形式如图4所示。

在类图中表示关系

类和类、类和接口、接口和接口之间存在一定关系,UML类图中一般会有连线指明它们之间的关系。关系共有六种类型,分别是实现关系、泛化关系、关联关系、依赖关系、聚合关系、组合关系,如图6所示。

下面我们详细讲述这些关系,以及在UML类图中如何表示这些关系。

1)实现关系

实现关系是指接口及其实现类之间的关系。在UML类图中,实现关系用空心三角和虚线组成的箭头来表示,从实现类指向接口,如图1.9所示。在Java代码中,实现关系可以直接翻译为关键字 implements

2)泛化关系

泛化关系(Generalization)是指对象与对象之间的继承关系。如果对象A和对象B之间的“is a”关系成立,那么二者之间就存在继承关系,对象B是父对象,对象A是子对象。例如,一个年薪制员工“is a”员工,很显然年薪制员工Salary对象和员工Employee对象之间存在继承关系,Employee对象是父对象,Salary对象是子对象。

在UML类图中,泛化关系用空心三角和实线组成的箭头表示,从子类指向父类,如图8所示。在Java代码中,对象之间的泛化关系可以直接翻译为关键字 extends

3)关联关系

关联关系(Association)是指对象和对象之间的连接,它使一个对象知道另一个对象的属性和方法。在Java中,关联关系的代码表现形式为一个对象含有另一个对象的引用。也就是说,如果一个对象的类代码中,包含有另一个对象的引用,那么这两个对象之间就是关联关系。

关联关系有单向关联和双向关联。如果两个对象都知道(即可以调用)对方的公共属性和操作,那么二者就是双向关联。如果只有一个对象知道(即可以调用)另一个对象的公共属性和操作,那么就是单向关联。大多数关联都是单向关联,单向关联关系更容易建立和维护,有助于寻找可重用的类。

在UML图中,双向关联关系用带双箭头的实线或者无箭头的实线双线表示。单向关联用一个带箭头的实线表示,箭头指向被关联的对象,如图9所示。这就是导航性(Navigatity)。

一个对象可以持有其它对象的数组或者集合。在UML中,通过放置多重性(multipicity)表达式在关联线的末端来表示。多重性表达式可以是一个数字、一段范围或者是它们的组合。多重性允许的表达式示例如下:

  • 数字:精确的数量
  • *或者0..*:表示0到多个
  • 0..1:表示0或者1个,在Java中经常用一个空引用来实现
  • 1..*:表示1到多个

关联关系又分为依赖关联、聚合关联和组合关联三种类型。

4)依赖关系

依赖(Dependency)关系是一种弱关联关系。如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系。如果对象A依赖于对象B,则 A “use a” B。比如驾驶员和汽车的关系,驾驶员使用汽车,二者之间就是依赖关系。

在UML类图中,依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,表示使用方对象持有被使用方对象的引用,如图10所示。

依赖关系在Java中的具体代码表现形式为B为A的构造器方法中的局部变量方法或构造器的参数方法的返回值,或者A调用B的静态方法

下面我们用代码清单1和代码清单2所示的Java代码来演示对象和对象之间的依赖关系。

代码清单1所示的B类定义了一个成员变量 field1,一个普通方法 method1() 和一个静态方法 method2()

//代码清单1 B.java
public class B {public String field1;   //成员变量public void method1() {System.println("在类B的方法1中");}public static void method2() {                 //静态方法System.out.println("在类B的静态方法2中");}
}

代码清单2所示的A类依赖于B类,在A类中定义了四个方法,分别演示四种依赖形式。

/* 代码清单2 A.javaA依赖于B
*/public class A {public void method1() {//A依赖于B的第一种表现形式:B为A的局部变量B b = new B();b.method1();}public void method2() {//A依赖于B的第二种表现形式: 调用B的静态方法B.method2();}public void method3(B b)  {//A依赖于B的第三种表现形式:B作为A的方法参数String s = b.field1;}//A依赖于B的第四种表现形式:B作为A的方法的返回值public B method4() {return new B();}
}

5)聚合关系与组合关系

聚合(Aggregation)是关联关系的一种特例,它体现的是整体与部分的拥有关系,即 “has a” 的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享,所以聚合关系也常称为共享关系。例如,公司部门与员工的关系,一个员工可以属于多个部门,一个部门撤消了,员工可以转到其它部门。

在UML图中,聚合关系用空心菱形加实线箭头表示,空心菱形在整体一方,箭头指向部分一方,如图11所示。

组合(Composition)也是关联关系的一种特例,它同样体现整体与部分间的包含关系,即 “contains a” 的关系。但此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强,也称为强聚合。如果A组合B,则A需要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B的生成和释放。

例如,人包含头、躯干、四肢,它们的生命周期一致。当人出生时,头、躯干、四肢同时诞生。当人死亡时,作为人体组成部分的头、躯干、四肢同时死亡。

在UML图中,组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方,如图12所示。

在Java代码形式上,聚合和组合关系中的部分对象是整体对象的一个成员变量。但是,在实际应用开发时,两个对象之间的关系到底是聚合还是组合,有时候很难区别。在Java中,仅从类代码本身是区分不了聚合和组合的。如果一定要区分,那么如果在删除整体对象的时候,必须删掉部分对象,那么就是组合关系,否则可能就是聚合关系。从业务角度上来看,如果作为整体的对象必须要部分对象的参与,才能完成自己的职责,那么二者之间就是组合关系,否则就是聚合关系。

例如,汽车与轮胎,汽车作为整体,轮胎作为部分。如果用在二手车销售业务环境下,二者之间就是聚合关系。因为轮胎作为汽车的一个组成部分,它和汽车可以分别生产以后装配起来使用,但汽车可以换新轮胎,轮胎也可以卸下来给其它汽车使用。如果用在驾驶系统业务环境上,汽车如果没有轮胎,就无法完成行驶任务,二者之间就是一个组合关系。再比如网上书店业务中的订单和订单项之间的关系,如果订单没有订单项,也就无法完成订单的业务,所以二者之间是组合关系。而购物车和商品之间的关系,因为商品的生命周期并不被购物车控制,商品可以被多个购物车共享,因此,二者之间是聚合关系。

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

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

相关文章

Microsoft SQL Server 2005数据库安装

Microsoft SQL Server 2005数据库&#xff0c;电脑里原有的mssql2000已经不适用了&#xff0c;到网上寻找SQL Server 2005简体中文开发版的下载地址&#xff0c;一开始下载了个学习版的express&#xff0c;可限制太多&#xff0c;还是决心安装开发版本的。到微软的官方网站寻找…

Wince6.0 cleartype

WinCE6.0下显示宋体毛刺很严重&#xff0c;影响显示效果&#xff0c;打开cleartype以后字体显示平滑&#xff0c;但是不知道为什么wince桌面上的中文字体显示乱码&#xff0c;而且自己的引用程序也变的很卡。 开始以为是字库的原因&#xff0c;后来添加了系统的组件以后一切正常…

【转】ubuntu16.04安装配置tftp服务

转自&#xff1a;ubuntu16.04安装配置tftp服务_carspiriter的博客-CSDN博客_ubuntu安装tftp 首先声明&#xff1a;tftp是client客户端&#xff0c;tftpd是server服务器端&#xff0c;d应该指的是daemon。如果你要从别人的tftp服务器端上传/下载东西&#xff0c;就要用到tftp&a…

【转】Dicom中的Image Orientation/Position的理解

转自&#xff1a;Dicom中的Image Orientation/Position的理解 - 知乎 在DICOM中&#xff0c;是通过Image Position和Image Orientation来描述当前的图像和人体坐标系的相对位置的。 打开DCM文件时&#xff0c;会发现下边的两个tag (0020,0032) DS ImagePosition(Patient) &q…

【转】矩阵变换坐标系 深入理解

转自&#xff1a;矩阵变换坐标系 深入理解 - 知乎 网址链接&#xff1a;从坐标系图中理解“空间变换” 小谈矩阵和坐标变换 矩阵坐标系变化理解 让我们从一个实际的例子入手&#xff1a;下图是一个用两维的笛卡尔坐标系表示的二维空间。 其中&#xff0c;黑色坐标系 x-y代表…

【转】坐标系变换矩阵推导

转自&#xff1a; 坐标系的变换矩阵推导 1.平移变换 假设存在点(x,y,z)&#xff0c;将x移动a&#xff0c;y移动b&#xff0c;z移动c&#xff0c;到新的点(x′,y′,z′)&#xff0c;则&#xff1a; 中间4x4的矩阵叫变换矩阵。可见&#xff0c;如果要平移坐标&#xff0c;要将坐…

【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

转自&#xff1a;图形流水线中坐标变换详解&#xff1a;模型矩阵、视角矩阵、投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解&#xff1a;模型矩阵、视角矩阵、投影矩阵 图形流水线中坐标变换过程模型矩阵&#xff1a;模型局部坐标系和世界坐标系之…

【转】C#开发PACS医学影像处理系统(二):界面布局之菜单栏

转自&#xff1a;C#开发PACS医学影像处理系统(二)&#xff1a;界面布局之菜单栏 - 乔克灬叔叔 - 博客园 在菜单栏布局上&#xff0c;为了使用自定义窗体样式和按钮&#xff0c;我们需要先将窗体设置为无边框&#xff0c;然后添加一个Grid作为菜单栏并置顶&#xff0c;Vertical…

WF4.0 基础篇 (二十九) WorkflowInspectionServices

本文例子下载: http://files.cnblogs.com/foundation/WorkflowInspectionServicesSample.rar WorkflowInspectionServices 类 WorkflowInspectionServices可以得到流程中的Activity&#xff0c; 由于WF4.0的ActivityTree相对复杂,并不是象WF3.X的结构那样清晰, 在WF4.0中Activi…

【转】C#开发PACS医学影像处理系统(三):界面布局之工具栏

转自&#xff1a;https://www.cnblogs.com/Uncle-Joker/p/13650330.html 工具栏布局采用WPF中Grid作为容器&#xff0c;按钮采用自定义样式和图标&#xff0c;并采用Separator分割线&#xff1a; XAML设计器代码&#xff1a; 其中 Style"{StaticResource ButtonStyle}&…

WinCE6.0 修改开机Logo方法

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将 Logo 图片的数据写入到 Nand Flash 中&#xff0c;在启动初始化 LCD 的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。实验平台&#xff1a;WinCE6.0Android6410 4.3寸CLD。以下内…

【转】DICOM开发工具总结

转自&#xff1a;DICOM开发工具总结_qimo601的专栏-CSDN博客 网上流行的DICOM协议开发工具&#xff1a; 1、DICOM开发类库主要有&#xff1a; &#xff08;1&#xff09;DCMTK(3.6.0), 官方下载网站,&#xff08;如何安装编译DCMTK3.6.0&#xff09; DCMTK实现了对DICOM图像…

【转】CT中的“层“与“排“的区别

转自&#xff1a;CT中的"层"与"排"的区别 自从离开医院&#xff0c;专业培训磁共振&#xff0c;有差不多5年时间没有接触CT了。影像技术及影像医学诊断说到底是一门经验技术累积学科&#xff0c;这种学科的特点就是熟能生巧&#xff0c;几年不碰&#xff0…

修改SMDK6410的调试串口为普通串口(wince系统)

环境&#xff1a; 飞凌OK6410A开发板&#xff0c; Windows CE6.0系统 最近在做GPRS通信&#xff0c;可是手头上的GPRS模块&#xff08;Q2403A&#xff09;是五线串口的&#xff08;RXD、TXD、GND、RCS、CTS&#xff09;&#xff0c;老板又不愿买新的模块。所以考虑将调试串口CO…

【转】CTA图像

转自&#xff1a;CTA图像 CT检查在临床中应用十分广泛&#xff0c;CT以其扫描速度快&#xff0c;对骨头及钙化敏感而具有部分优势。 CTA是CT血管成像&#xff0c;是CT临床应用中一个非常重要的部分&#xff0c;由于血管及其背景软组织自然对比差&#xff0c;常规CT平扫往往难以…

大白话系列之C#委托与事件讲解(一)

从序言中&#xff0c;大家应该对委托和事件的重要性有点了解了吧&#xff0c;虽然说我们现在还是能模糊&#xff0c;但是从我的大白话系列中&#xff0c;我会把这些概念说的通俗易懂的。首先&#xff0c;我们还是先说说委托吧&#xff0c;从字面上理解&#xff0c;只要是中国人…

【转】医学影像处理相关知识整理(一)

转自&#xff1a;医学影像处理相关知识整理&#xff08;一&#xff09; - 知乎 Segmentation to RT structure 近日做医疗影像处理相关的内容&#xff0c;感慨于这方面资料不全、散碎&#xff0c;遂记录自己获得的一些资料以供日后查阅。 DICOM DICOM 是医学图像和相关信息…

【转】软件工程能力漫谈:比质量更重要的,是项目管理能力

转自&#xff1a;软件工程能力漫谈&#xff1a;比质量更重要的&#xff0c;是项目管理能力 | ArchSummit 章淼老师在软件工程能力方面&#xff0c;积累了多年的经验&#xff0c;这个话题他之前也分享过多次&#xff0c;整体上内容有修改调整。 章老师博士毕业后在清华待了 12…

【转】DICOM文件格式剖析(初识)

转自&#xff1a;DICOM文件格式剖析&#xff08;初识&#xff09;_MoreThinker的博客-CSDN博客_dicom格式 初识DICOM&#xff08;适合初学者&#xff09; 初识DICOM文件&#xff0c;发现网上的资料有点少&#xff0c;大部分的资料都不全&#xff0c;在这里做一下总结&#xf…

【转】进阶 JavaScript 必知的 33 个点【进阶必备】

转自&#xff1a;进阶 JavaScript 必知的 33 个点【进阶必备】 进阶 JavaScript 必知的 33 个点【进阶必备】 Original 前端小菜鸡之菜鸡互啄 前端开发爱好者 2022-04-11 08:32 收录于话题#javaScript进阶1个 点击下方“前端开发爱好者”&#xff0c;选择“设为星标” 第一…