类图详解
2016-01-07 15:18
337 查看
参考:http://www.uml.org.cn/oobject/201510214.asp
http://blog.csdn.net/zhaoweixing1989/article/details/7620061
http://blog.csdn.net/kevin_darkelf/article/details/11371353
Java中定义的类名。
属性(attributes)。
加号(+)表示具有公共可见性。
减号(-)表示私有可见性。
#号表示受保护的可见性。
省略这些修饰符表示具有package(包)级别的可见性。
该类提供的方法。
在操作中,可同时列出它接受的参数,以及返回类型,
如果属性或操作具有下划线,表明它是静态的。
如图A的“Java”区域所示。
第一行 : 类名,如果是抽象类,则用斜体显示.
第二行 : 字段或属性.
+:表示public;
-:表示:private;
#:表示protected;
在Java中,一个包可能含有其他包、类或者同时含有这两者。
进行建模时:
通常拥有逻辑性的包,它主要用于对你的模型进行组织。
还会拥有物理性的包,它直接转换成系统中的Java包。
每个包的名称对这个包进行了惟一性的标识。
接口既可用图C的那个图标来表示,也可由附加了<< interface>>的一个标准类来表示。
通常,根据接口在类图上的样子,就能知道与其他类的关系。
它表示一个接口图,与类图的区别主要是顶端有<< interface>>显示。第一行是接口名称,第二行是接口方法。
接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了‘讲人话’的接口。”
对于两个相对独立的类,当一个类负责构造另一个类的实例,或者依赖另一个类时,这两个类之间主要体现为依赖关系
属性:
实体之间“使用”关系表示一个实体的规范发生变化后,可能影响依赖于它的其他实例(图D)。
引用不在实例作用域内的一个类或对象的任何类型。
依赖的对象可以是被依赖方法中的一个参数或局部变量(如下例所示)
对依赖类的静态方法的引用(不存在那个类的一个实例)。
也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。
Java与UML对应图:
代码示例:
Bicycle类和Pump类之间是依赖关系,在Bicycle类中无需定义Pump类型的变量。Pump类对象是Bicycle类对象方法中的一个参数
Bicycle类的定义如下:
在现时生活中,通常不会为某一辆自行车配备专门的打气筒,而是在需要充气的时候,从附近某个修车棚里借个打气筒打气。
在程序代码中,表现为Bicycle类的expand()方法有个Pump类型的参数。
以下程序代码表示某辆自行车先后到两个修车棚里充气:
对于两个相对独立的类,当一个类的实例与另一个类的实例存在固定的对应关系时,这两个类之间为关联关系。
属性:
实体之间的一个结构化关系表明对象是相互连接的。
UML关系图符号中关联关系的箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是一种双向的导航能力。
Java中的表现:
在Java中,关联关系是使用实例变量实现的。
Java与UML对应图:
就像图E的“Java”区域所展示的代码那样。可为一个关联附加其他修饰符。多重性(Multiplicity)修饰符暗示着实例之间的关系。
在示范中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。
代码示例:
客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;
公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司;
而充电电池和充电器之间就不存在固定的对应关系,同样自行车和打气筒之间也不存在固定的对应关系。
Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。以下是Person类的定义:
在现时生活中,当你骑自行车去上班时,只要从家里推出自己的自行车就能上路了,不像给自行车打气那样,在需要打气时,还要四处去找修车棚。因此,在Person类的goToWork()方法中,调用自身的bicycle对象的run()方法。
假如goToWork()方法采用以下的定义方式:
那就好比去上班前,还要先四处去借一辆自行车,然后才能去上班。
当系统A被加入到系统B中,成为系统B的组成部分时,系统B和系统A之间为聚集关系。
聚合(Aggregation)关系是关联关系的一种,是强的关联关系。
属性:
聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。
关联关系所涉及的两个类是处在同一层次上的,
聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
Java中的表现:
聚合关系也是通过实例变量实现的。
Java与UML对应图:
UML关系图符号中聚合是关联的一种形式,代表两个类之间的整体/局部关系。
关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合关系的实例图中不存在回路。换言之,只能是一种单向关系。
代码示例
例如自行车和它的响铃、龙头、轮胎、钢圈以及刹车装置就是聚集关系,因为响铃是自行车的组成部分。
聚合关系的类里含有另一个类作为参数 。
雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在
聚合关系图:
合成(图G)是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。
属性:
合成也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。比如你和你的大脑
但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
Java中的表现:
合成关系也是通过实例变量实现的。
Java与UML对应图:
Employee和TimeCard的关系或许更适合表示成“合成”,而不是表示成“关联”。
代码示例:
组合关系的类里含有另一个类的实例化 。
大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在
组合关系图:
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;箭头是从子类指向父类的,与继承或实现的方法相反。
UML关系图符号中泛化是用于对继承进行建模的UML元素。
Java中的表现:
在Java中,用extends关键字来直接表示这种关系。
Java与UML对应图:
实例(图I)关系指实现接口,箭头指向接口
Java中的表现:
对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
Java与UML对应图:
而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的
例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
组合>聚合>关联>依赖;
http://blog.csdn.net/zhaoweixing1989/article/details/7620061
http://blog.csdn.net/kevin_darkelf/article/details/11371353
类(Class)
类是对象的蓝图,其中包含3个组成部分。Java中定义的类名。
属性(attributes)。
加号(+)表示具有公共可见性。
减号(-)表示私有可见性。
#号表示受保护的可见性。
省略这些修饰符表示具有package(包)级别的可见性。
该类提供的方法。
在操作中,可同时列出它接受的参数,以及返回类型,
如果属性或操作具有下划线,表明它是静态的。
如图A的“Java”区域所示。
第一行 : 类名,如果是抽象类,则用斜体显示.
第二行 : 字段或属性.
+:表示public;
-:表示:private;
#:表示protected;
包(Package)
包是一种常规用途的组合机制。UML中的一个包直接对应于Java中的一个包。在Java中,一个包可能含有其他包、类或者同时含有这两者。
进行建模时:
通常拥有逻辑性的包,它主要用于对你的模型进行组织。
还会拥有物理性的包,它直接转换成系统中的Java包。
每个包的名称对这个包进行了惟一性的标识。
接口(Interface)
接口是一系列操作的集合,它指定了一个类所提供的服务。它直接对应于Java中的一个接口类型。接口既可用图C的那个图标来表示,也可由附加了<< interface>>的一个标准类来表示。
通常,根据接口在类图上的样子,就能知道与其他类的关系。
它表示一个接口图,与类图的区别主要是顶端有<< interface>>显示。第一行是接口名称,第二行是接口方法。
接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了‘讲人话’的接口。”
类图关系
依赖(Dependency)
定义:对于两个相对独立的类,当一个类负责构造另一个类的实例,或者依赖另一个类时,这两个类之间主要体现为依赖关系
属性:
实体之间“使用”关系表示一个实体的规范发生变化后,可能影响依赖于它的其他实例(图D)。
引用不在实例作用域内的一个类或对象的任何类型。
依赖的对象可以是被依赖方法中的一个参数或局部变量(如下例所示)
对依赖类的静态方法的引用(不存在那个类的一个实例)。
也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。
Java与UML对应图:
代码示例:
Bicycle类和Pump类之间是依赖关系,在Bicycle类中无需定义Pump类型的变量。Pump类对象是Bicycle类对象方法中的一个参数
Bicycle类的定义如下:
[code]public class Bicycle{ /** 给轮胎充气 */ public void expand(Pump pump){ pump.blow(); } }
在现时生活中,通常不会为某一辆自行车配备专门的打气筒,而是在需要充气的时候,从附近某个修车棚里借个打气筒打气。
在程序代码中,表现为Bicycle类的expand()方法有个Pump类型的参数。
以下程序代码表示某辆自行车先后到两个修车棚里充气:
[code]myBicycle.expand(pumpFromRepairShed1); //到第一个修车棚里充气 myBicycle.expand(pumpFromRepairShed2); //若干天后,到第二个修车棚里充气
关联(Association)
定义:对于两个相对独立的类,当一个类的实例与另一个类的实例存在固定的对应关系时,这两个类之间为关联关系。
属性:
实体之间的一个结构化关系表明对象是相互连接的。
UML关系图符号中关联关系的箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是一种双向的导航能力。
Java中的表现:
在Java中,关联关系是使用实例变量实现的。
Java与UML对应图:
就像图E的“Java”区域所展示的代码那样。可为一个关联附加其他修饰符。多重性(Multiplicity)修饰符暗示着实例之间的关系。
在示范中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。
代码示例:
客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;
公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司;
而充电电池和充电器之间就不存在固定的对应关系,同样自行车和打气筒之间也不存在固定的对应关系。
Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。以下是Person类的定义:
[code]public class Person{ private Bicycle bicycle; //主人的自行车 public Bicycle getBicycle(){ return bicycle; } public void setBicycle(Bicycle bicycle){ this.bicycle=bicycle; } /** 骑自行车去上班 */ public void goToWork(){ bicycle.run(); } }
在现时生活中,当你骑自行车去上班时,只要从家里推出自己的自行车就能上路了,不像给自行车打气那样,在需要打气时,还要四处去找修车棚。因此,在Person类的goToWork()方法中,调用自身的bicycle对象的run()方法。
假如goToWork()方法采用以下的定义方式:
[code]/** 骑自行车去上班 */ public void goToWork(Bicycle bicycle){ bicycle.run(); }
那就好比去上班前,还要先四处去借一辆自行车,然后才能去上班。
聚合(Aggregation)
定义:当系统A被加入到系统B中,成为系统B的组成部分时,系统B和系统A之间为聚集关系。
聚合(Aggregation)关系是关联关系的一种,是强的关联关系。
属性:
聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。
关联关系所涉及的两个类是处在同一层次上的,
聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
Java中的表现:
聚合关系也是通过实例变量实现的。
Java与UML对应图:
UML关系图符号中聚合是关联的一种形式,代表两个类之间的整体/局部关系。
关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合关系的实例图中不存在回路。换言之,只能是一种单向关系。
代码示例
例如自行车和它的响铃、龙头、轮胎、钢圈以及刹车装置就是聚集关系,因为响铃是自行车的组成部分。
聚合关系的类里含有另一个类作为参数 。
雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在
聚合关系图:
[code]public class GooseGroup { public Goose goose; public GooseGroup(Goose goose) { this.goose = goose; } }
合成(Composition)
定义:合成(图G)是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。
属性:
合成也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。比如你和你的大脑
但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。
Java中的表现:
合成关系也是通过实例变量实现的。
Java与UML对应图:
Employee和TimeCard的关系或许更适合表示成“合成”,而不是表示成“关联”。
代码示例:
组合关系的类里含有另一个类的实例化 。
大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在
组合关系图:
[code]public class Goose { public Wings wings; public Goose() { wings=new Wings(); } }
泛化(Generalization)
定义:指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;箭头是从子类指向父类的,与继承或实现的方法相反。
UML关系图符号中泛化是用于对继承进行建模的UML元素。
Java中的表现:
在Java中,用extends关键字来直接表示这种关系。
Java与UML对应图:
实现(Realization)
定义:实例(图I)关系指实现接口,箭头指向接口
Java中的表现:
对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。
Java与UML对应图:
各个关系的区别
1、聚合和组合
在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。
(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。
(2)部件的生命周期不同
聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。
(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。
2.关联和聚合
(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。
(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。
(4)关联和聚合是视问题域而定的
例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;
相关文章推荐
- Hibernate继承映射
- Enumerating Child Devices of a Display Adapter
- jqGrid API 全
- nodejs 中Express 的 send方法
- VS2013崩溃,无法打开项目的解决方案
- oc之类排序
- xilinx_modelsim仿真错误1
- Linux Shell删除某一个目录下的所有文件夹(保留其他文件)
- Android开源类库和工具集合
- Struts2拦截器浅析
- Collection集合对象
- ASP.NET MVC 5 01 - ASP.NET概述
- 遍历
- hibernate的批量处理
- javaMail发送电子邮件
- SSH——浅谈spring中的事务(一)
- Android Espresso单元测试
- TCP/IP具体解释--nagle算法和TCP_NODELAY
- 快速搭建动态web工程并且进行数据库交互页面呈现
- BZOJ 1036 [ZJOI2008]树的统计Count 树链剖分练手题