您的位置:首页 > 其它

类图详解

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

类(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.综合比较

这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:

组合>聚合>关联>依赖;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: