依赖和关联的理解!

本文旨在厘清关联关系和依赖关系。关联是结构关系,如人和公司、公司和办公室,在类图模型中建立对应关联;依赖是使用关系,一个对象调用另一个对象服务。作者认为关联中A维护B,B修改不影响A;依赖中A访问B成员或方法,B修改可能影响A。

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

一直以来都被这两种关系搞得晕头转向,今天决定弄清楚。网上有一篇文章http://herald.seu.edu.cn/blog/dipper/articles/9800.aspx

本人觉得理解有问题。

关联:一种结构关系,表现为一个对象能够获得另一个对象的是类引用并调用他的服务。关联(Association)表示两个类之间存在某种语义上的联系。例如,一个人为一家公司工作,一家公司有许多办公室。我们就认为人和公司、公司和办公室之间存在某种语义上的联系。在分析设计的类图模型中,则在对应人类和公司类、公司类和办公室类之间建立关联关系。


依赖:一种使用关系,表现为一个对象仅仅是调用了另一个对象的服务。有两个元素X、Y,如果修改元素X的定义可能会引起对另一个元素Y的定义的修改,则称元素Y依赖(Dependency)于元素X。在类中,依赖由各种原因引起,如:一个类向另一个类发消息;一个类是另一个类的数据成员;一个类是另一个类的某个操作参数。如果一个类的界面改变,它发出的任何消息可能不再合法。

下面是本人的理解:

A 和 B是关联关系,A关联B

关联是一种结构关系,A它原则上不使用(调用)B,它只负责维护B,也就是创建B对象和清理B对象,它不使用B对象的属性和方法。当B做修改时应该不会影响到A。因为A只是负责管理B,不对它做任何操作。

A 和 B是依赖关系,A依赖B
依赖是一种使用关系,在A中会访问B的成员或者方法,所以当B做修改时可能会影响到A。

(1)抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。 抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。 抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象数据抽象两个方面。 过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。 数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改观察。数据抽象是OOA的核心原则。它强调把数据(属性)操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。 (2)封装就是把对象的属性服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。 (3)继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。 在OOA中运用继承原则,就是在每个由一般类特殊类形成的一般-特殊结构中,把一般类的对象实例所有特殊类的对象实例都共同具有的属性服务, 一次性地在一般类中进行显式的定义。 在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类 (以及所有更上层的一般类)中定义的全部属性服务。继承原则的好处是:使系统模型比较简练也比较清晰。 (4)分类:就是把具有相同属性服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。 (5)聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。 (6)关联:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。 (7)消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。 (8)粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。 (9)行为分析:现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。
<think>嗯,我现在需要解释Java中的关联依赖。这两个概念我之前学过,但可能有点模糊,得仔细想想怎么区分它们。首先,关联是什么?记得关联是类之间的一种结构关系,表示一个类知道另一个类,比如一个类有另一个类的实例变量。比如,学生课程之间的关系,学生类里可能有课程类的对象,这就是关联对吧。关联可以是单向或双向的,比如学生知道课程,但课程不一定知道学生,除非双向关联。 然后是依赖依赖应该是指一个类在方法中使用到另一个类,比如参数类型或者局部变量,或者调用另一个类的方法。这时候,一个类的改动可能会影响另一个类,比如方法里临时创建了一个对象,或者参数传进来。比如,一个Teacher类的方法里用了Student类的对象作为参数,这样Teacher就依赖于Student。 那两者的区别呢?关联是长期存在的,属于结构上的关系,比如成员变量;而依赖是临时的,只在方法中使用。比如,关联是“有”的关系,比如学生有课程;依赖是“使用”的关系,比如方法中使用另一个类。 可能需要举例子说明。例如,关联的例子:学生类有一个课程类的成员变量,构造方法或者setter设置这个课程。这样学生对象课程对象之间就存在关联关系。而依赖的例子,比如一个方法需要传入课程对象进行计算,这时候就是依赖,因为课程作为参数存在,不是学生类的成员。 另外,组合聚合是不是关联的特例?对的,关联包括组合聚合,但关联本身更一般。组合是整体部分的生命周期一致,比如公司部门,公司没了部门也没了。聚合则是部分可以独立存在,比如汽车轮子,汽车销毁了轮子还可以用。不过这可能超出了当前问题范围,但需要明确关联是更广泛的概念。 可能还要注意UML图中的表示。关联用实线箭头,依赖用虚线箭头。关联有成员变量,依赖是方法参数或局部变量。 总结一下,关联是结构上的、长期的关系,依赖是使用上的、临时的关系。需要清晰地区分两者的不同应用场景,避免混淆。在</think> Java 中,**关联(Association)****依赖(Dependency)**是描述类之间关系的两种重要概念,它们的核心区别在于**关系的强度****生命周期**。 --- ### **1. 关联(Association)** - **定义**: 关联表示类之间的结构关系,即一个类“知道”另一个类(通过成员变量持有对方的引用)。这种关系通常是**长期存在**的,且与对象生命周期无关。 - **特点**: - **结构关系**:通过类的成员变量直接体现。 - **方向性**:可以是单向(如学生知道课程)或双向(学生课程互相知道)。 - **强弱形式**:关联包含更具体的聚合(Aggregation)组合(Composition)。 - **代码示例**: ```java class Student { private Course course; // 成员变量体现关联关系 public void setCourse(Course course) { this.course = course; } } class Course { // 可双向关联(如包含 Student 的集合) } ``` - **UML 表示**:实线箭头(单向)或实线无箭头(双向)。 --- ### **2. 依赖(Dependency)** - **定义**: 依赖表示一个类临时“使用”另一个类,但不会长期持有其引用。这种关系是**短暂的**,通常体现在方法参数、局部变量或方法调用中。 - **特点**: - **临时性**:仅在方法执行期间存在。 - **灵活性**:不涉及对象的所有权,仅表示“使用”。 - **代码示例**: ```java class Teacher { // 依赖关系:通过方法参数使用 Course 类 public void teach(Course course) { course.start(); } } class Course { public void start() { /* ... */ } } ``` - **UML 表示**:虚线箭头(指向被依赖的类)。 --- ### **关键区别** | **特征** | **关联(Association)** | **依赖(Dependency)** | |------|-----------------------------------| | **生命周期** | 长期(通过成员变量持有对象) | 临时(仅在方法执行期间存在) | | **代码体现** | 成员变量 | 方法参数、局部变量、返回值等 | | **关系强度** | 强关系(结构上直接关联) | 弱关系(临时使用) | | **UML 表示** | 实线箭头 | 虚线箭头 | --- ### **实际应用场景** - **关联**: - 学生选课(`Student` 持有 `Course` 的引用)。 - 汽车引擎(`Car` 类包含 `Engine` 成员变量)。 - **依赖**: - 工具类方法(如 `StringUtils` 处理 `String` 对象)。 - 控制器调用服务层(方法参数传递服务对象)。 --- ### **总结** - **关联**是“拥有”关系,体现类之间的结构连接; - **依赖**是“使用”关系,体现临时性的协作。 理解这两者的区别有助于设计高内聚、低耦合的代码结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值