UML详解之二——类图

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50475352 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

类(Class)

类图(ClassDiagrams)是根据系统中的类以及各类之间的关系描述系统的静态视图。类图不仅显示系统内信息的结构,还描述系统内这些信息的行为。类图的一个重要目的是为其他图(如顺序图、交互图)定义一个基础。类图由多个类以及这些类之间的关系组成。

在系统设计阶段,类图直接引导面向对象的编程语言实现类。类图是生成代码的核心要图。如果类图设计得好,整个系统的代码框架可以有类图自动生成,大大简化了系统编码所耗费的时间。因此,我们进一步:利用类图,使得代码的编写编程一种自动化工作,而整个信息系统的建设中心都可以集中到分析设计上来。

这里写图片描述.

是对象的蓝图,其中包含3个组成部分

  1. Java中定义的类名。
  2. 属性(attributes)。
    • 加号(+)表示具有公共可见性。
    • 减号(-)表示私有可见性。
    • #号表示受保护的可见性。
    • 省略这些修饰符表示具有package(包)级别的可见性。
  3. 该类提供的方法。
    • 在操作中,可同时列出它接受的参数,以及返回类型,

如果属性或操作具有下划线,表明它是静态的。

如图A的“Java”区域所示。

图A

  • 第一行 : 类名,如果是抽象类,则用斜体显示.

  • 第二行 : 字段或属性.

    • +:表示public;
    • -:表示:private;
    • #:表示protected;

包(Package)

包是一种常规用途的组合机制。UML中的一个包直接对应于Java中的一个包。

在Java中,一个包可能含有其他包、类或者同时含有这两者。

进行建模时:

  • 通常拥有逻辑性的包,它主要用于对你的模型进行组织。
  • 还会拥有物理性的包,它直接转换成系统中的Java包。
  • 每个包的名称对这个包进行了惟一性的标识。

这里写图片描述


接口(Interface)

接口是一系列操作的集合,它指定了一个类所提供的服务。它直接对应于Java中的一个接口类型。

接口既可用图C的那个图标来表示,也可由附加了<< interface>>的一个标准类来表示。

通常,根据接口在类图上的样子,就能知道与其他类的关系。

这里写图片描述

它表示一个接口图,与类图的区别主要是顶端有<< interface>>显示。第一行是接口名称,第二行是接口方法。

接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了‘讲人话’的接口。”


类图关系


1、依赖(Dependency)

定义:
对于两个相对独立的类,当一个类负责构造另一个类的实例,或者依赖另一个类时,这两个类之间主要体现为依赖关系

属性:
实体之间“使用”关系表示一个实体的规范发生变化后,可能影响依赖于它的其他实例(图D)。

  • 引用不在实例作用域内的一个类或对象的任何类型。

    • 依赖的对象可以是被依赖方法中的一个参数局部变量(如下例所示)
    • 对依赖类的静态方法的引用(不存在那个类的一个实例)。
  • 也可利用“依赖”来表示包和包之间的关系。由于包中含有类,所以你可根据那些包中的各个类之间的关系,表示出包和包的关系。

Java与UML对应图:
这里写图片描述

举例:
Bicycle类和Pump类之间是依赖关系,在Bicycle类中无需定义Pump类型的变量。Pump类对象是Bicycle类对象方法中的一个参数

Bicycle类的定义如下:

public class Bicycle{
/** 给轮胎充气 */
  public void expand(Pump pump){
    pump.blow();
  }
}

在现时生活中,通常不会为某一辆自行车配备专门的打气筒,而是在需要充气的时候,从附近某个修车棚里借个打气筒打气。

在程序代码中,表现为Bicycle类的expand()方法有个Pump类型的参数。

以下程序代码表示某辆自行车先后到两个修车棚里充气:

myBicycle.expand(pumpFromRepairShed1); //到第一个修车棚里充气
myBicycle.expand(pumpFromRepairShed2); //若干天后,到第二个修车棚里充气

2、关联(Association)

定义:
对于两个相对独立的类,当一个类的实例与另一个类的实例存在固定的对应关系时,这两个类之间为关联关系。

属性:
实体之间的一个结构化关系表明对象是相互连接的。
UML关系图符号中关联关系的箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是一种双向的导航能力。

Java中的表现:
在Java中,关联关系是使用实例变量实现的。

Java与UML对应图:
就像图E的“Java”区域所展示的代码那样。可为一个关联附加其他修饰符。多重性(Multiplicity)修饰符暗示着实例之间的关系。

在示范中,Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。

这里写图片描述

举例:

  • 客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;
  • 公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司;
  • 而充电电池和充电器之间就不存在固定的对应关系,同样自行车和打气筒之间也不存在固定的对应关系。

Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。以下是Person类的定义:

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()方法采用以下的定义方式:

/** 骑自行车去上班 */
public void goToWork(Bicycle bicycle){
  bicycle.run();
}

那就好比去上班前,还要先四处去借一辆自行车,然后才能去上班。


3、聚合(Aggregation)

定义:
当系统A被加入到系统B中,成为系统B的组成部分时,系统B和系统A之间为聚集关系。

聚合(Aggregation)关系是关联关系的一种,是强的关联关系

属性:
聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。

  • 关联关系所涉及的两个类是处在同一层次上的,
  • 聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。

Java中的表现:
聚合关系也是通过实例变量实现的。

Java与UML对应图:
UML关系图符号中聚合是关联的一种形式,代表两个类之间的整体/局部关系。

关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合关系的实例图中不存在回路。换言之,只能是一种单向关系。

这里写图片描述

举例:
例如自行车和它的响铃、龙头、轮胎、钢圈以及刹车装置就是聚集关系,因为响铃是自行车的组成部分。

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

聚合关系图:
这里写图片描述

public class GooseGroup 
    { 
public Goose goose; 
public GooseGroup(Goose goose) 
        { 
this.goose = goose; 
        } 
    } 

4、组合(合成)(Composition)

定义:
组合(图G)是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。

属性:
组合也是非共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。比如你和你的大脑

但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。

Java中的表现:
组合关系也是通过实例变量实现的。

Java与UML对应图:
Employee和TimeCard的关系或许更适合表示成“合成”,而不是表示成“关联”。
这里写图片描述

举例:
组合关系的类里含有另一个类的实例化 。
大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在

组合关系图:
这里写图片描述

public class Goose 
{ 
public Wings wings; 
public Goose() 
    { 
        wings=new Wings(); 
    } 
} 

5、泛化(Generalization)

定义:
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系;箭头是从子类指向父类的,与继承或实现的方法相反。
泛化表示一个更泛化的元素和一个更具体的元素之间的关系。UML关系图符号中泛化是用于对继承进行建模的UML元素。

Java中的表现:
在Java中,用extends关键字来直接表示这种关系。

Java与UML对应图:
这里写图片描述


6、实现(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.综合比较

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

组合>聚合>关联>依赖;

参考: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
http://blog.csdn.net/lishehe/article/details/8228655

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛瑄

文章不错,请博主吃包辣条

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值