UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

类图

​ 类图(Class Diagram)是显示出类、接口以及他们之间的静态结构与关系的图。其中最基本的单元是类或接口。

​ 类图不但可以表示类(或者接口)之间的关系,也可以表示对象之间的关系。下面是一个典型的类图:
1013480-20190124183457742-1273642474.png

​ 类图一般分为几个部分:类名、属性、方法。下面分别讲解。

(1) 类名

​ 上面的TestClass就是类名,如果类名是正体字,则说明该类是一个具体的类,如果类名是斜体字,则说明类是一个抽象类abstract。

(2)属性列表

​ 属性可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。

(3)方法列表

​ 方法可以是public、protected、private。public前面的图标是菱形,protected对应的是菱形加钥匙,private对应的是菱形加锁。当然,这只是一种表现方式。我是用的是Rational Rose,如果用的是别的软件,还可能使用+、-、#表示:+代表public、-代表private、#代表protected。

​ 对于静态属性,属性名会加上一条下划线。如上图所示。

​ 此外,类图既能表示类之间的关系,还能表示对象之间的关系。二者的区别是:对象图中对象名下面会加上一条下划线。

类图中的关系

Generalization:泛化

Generalization表示的是类与类之间的继承关系、接口与接口之间的继承关系、类与接口之间的实现关系。即指继承实现

Dependency:依赖

可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用,依赖是单向的,要避免双向依赖。一般来说,不应该存在双向依赖。

1013480-20190124182138410-1789790002.jpg

Association:关联

他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向,关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

1013480-20190124182219020-1363141070.jpg

Aggregation:聚合

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
1013480-20190124182233060-1628578704.jpg

Composition:组合

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
1013480-20190124182250419-453476194.jpg

关系之间的区别

1.聚合与组合

(1)聚合与组合都是一种关联关系,只是额外具有整体-部分的意涵。

(2)部件的生命周期不同

聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。

组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。

(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。

程老师的《大话》里举大那个大雁的例子很贴切 在此我就借用一下 大雁喜欢热闹害怕孤独 所以它们一直过着群居的生活 这样就有了雁群 每一只大雁都有自己的雁群 每个雁群都有好多大雁 大雁与雁群的这种关系就可以称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫做组合 有此可见 聚合的关系明显没有组合紧密 大雁不会因为它们的群主将雁群解散而无法生存 而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期

聚合关系图:
1013480-20190124182355405-1810046247.gif

组合关系图:
1013480-20190124182401747-644651542.gif

从从代码上看这两种关系的区别在于:

构造函数不同

雁群类:

public  class GooseGroup
{
    public Goose goose;

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

大雁类:

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

聚合关系的类里含有另一个类作为参数

雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在

组合关系的类里含有另一个类的实例化

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

信息的封装性不同

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

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

2.关联和聚合

(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。

(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。

(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

3.关联和依赖

(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。

4.综合比较

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

组合>聚合>关联>依赖

转载于:https://www.cnblogs.com/mabaoqing/p/10316120.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值