UML类对象基本关系解析

本文详细解释了UML中依赖、关联、泛化、继承、实现、聚合和组合等概念的区别及应用场景,帮助读者理解类之间的不同关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们平常要使用UML工具画类之间的关系,因此经常会见到依赖、关联、泛化、继承、实现、聚合、组合等概念,那么他们是怎么样的,区别在哪里呢?我在这里整理一下:

  • 依赖

依赖是指类A要完成一定的功能,必须要类B的帮助,例如使用到类B的方法,而类A和类B之间并没有比较亲密的联系,只是要利用B而已,他们之间的关系是偶然的,临时性的,比较脆弱,体现在代码形式上:类B只需作为类A的方法参数,或者类A直接使用类B的静态方法,而类B不会形成类A的属性

public class A{ //A在这里依赖B public void invoke(B b){ b.invoke(); } public void invoke2(){ B.invoke2(); } } public class B{ public void invoke(){ //B完成部分工作 } public static void invoke(){ //B完成部分工作 } }

在UML类图关系表示上:

虚线+箭头指向被依赖方,依赖关系好的实践是单向依赖,坏的实践的相互依赖,,千万不要出现双向依赖。

  • 关联

关联是指类A和类B之间存在比较强的关系,与依赖相比,这种关系不是偶然性的,例如人和人的常用住址,就是一种比较强的关系,不是临时的,是长期的,体现在代码层面:类B作为类A的一个属性存在,体现出他们的关系比较紧密。

public class A{ private B b; public void invoke(){ b.invoke(); } } public class B{ public void invoke() } }

在UML类图关系上:

实线+箭头指向被关联方,关联关系可以是双向,即A和B相互为对方的一个属性。

至于到底是用依赖还是关联关系,主要是看类之间关系的强弱,这个需要在一定的语境中来确定。

  • 泛化(继承)

泛化关系其实就是继承关系,包括接口继承和类继承,这个比较好理解。

public interface A{ void invoke(); } //接口继承 public interface B extends A{ void invoke2() } public class C{ public void invoke(){ } } //类继承 public class D extends C{ public void invoke2(){ } }

在UML关系图上表现:

实线+空心三角箭头指向被继承的基类或接口

  • 实现

实现关系也很好理解,类实现了一个接口。

public interface A{ void invoke(); } //实现关系 public class B implements A{ public void invoke2(){ } }

UML关系图如下:

虚线+空心三角箭头指向被实现接口

  • 聚合

聚合是关联的一种特例,语义上表示整体和个体 概念,表示has-a关系,整体和个体是可以分离的,整体和个体生命周期是独立的,例如,公司和员工,社团和成员,成员可以属于多个不同的整体,在代码层面上,聚合与关联是一样的,因此只能从语义上来区分。

在UML类图关系如下:

  • 组合

组合也是关联的一种特例,语义上表示主体和部分 概念,表示contains-a关系,整体和部分是不可以分离的,他们的生命周期是关联在一起的,主体灭亡,部分也随着灭亡,代码层面上,组合关系与聚合和关联都是一样的,因此也只能从语义上进行区分。

可见,其实这几个区别还是比较明显的,他们之间的关系基本都体现在语义关系上,代码上的实现可能基本类似,不过有一点,有了语义上的区分,那么在代码层面上尽量体现出语义来,也是一个比较好的做法,例如,代码中最好不要带着hand对象单独到处跑,应该跟着person才是最好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值