当前课程知识点:面向对象分析与设计 >  类设计 >  定义类之间的依赖关系、关联关系以及多重性设计 >  定义类之间的依赖关系、关联关系以及多重性设计

返回《面向对象分析与设计》慕课在线视频课程列表

定义类之间的依赖关系、关联关系以及多重性设计在线视频

定义类之间的依赖关系、关联关系以及多重性设计

下一节:定义类的泛化关系、解决用例冲突、非功能性需求

返回《面向对象分析与设计》慕课在线视频列表

定义类之间的依赖关系、关联关系以及多重性设计课程教案、知识点、字幕

同学们 今天呢

我们来介绍面向对象分析与设计的这门课的第24节

类设计(三)

在类设计三里面 我们首先讲如何来定义类之间的依赖关系

什么是依赖关系呢

依赖关系描述了两个对象之间的一种关系

在依赖关系里边

一个对象可能需要请求另外一个对象为它提供服务

对象之间的这种非结构化关系

都可能是它的依赖关系

如何来找到依赖关系呢

主要是通过两个对象之间的可见性

我们讲呢关联关系是一种结构化关系

而依赖关系是一种非结构化关系

区别两个类之间是关联关系还是结构化关系

主要依赖于两个类对象之间的可见性

这个这里的可见性主要有4种

第1种是局部变量引用

第2种是参数引用

第3种是全局引用

前面这三种 引用关系

或者说前面这三种可见性关系

我们都可以把它归纳为依赖关系

最后一种成员引用

把它归纳为关联关系

在关联和依赖关系里边

我们首先讲 关联关系它是一种持久的稳定的关系

如果两个对象之间不是参数的 全局的 局部的

这样一个可见 它都应该属于关联关系

而且关联关系呢 是上下文场景依赖的

而依赖关系呢 它是一种临时的 周期比较短的关系

依赖关系呢 往往是场景无关的

是一种总结性的关系 我们举个例子

比如在学校里面 我们的研究生同学和他的导师之间

从入学那一刻

他们建立了导师和学生之间的指导关系

这种关系是长期的稳定的

一直伴随着这个同学毕业为止的

所以这种关系我们称之为关联关系

那么什么是依赖关系呢

在这个同学中午去食堂买饭的时候

你吃的饭菜可口不可口

就取决于给你打饭的这个大厨 厨师

所以在买饭的那个瞬间 那个短短的时刻

这个同学和这个厨师之间所建立的关系

就是依赖关系 我们再回到程序里面

我们刚才讲来区分他们是通过可见性

那么第1种呢 是局部变量可见性

在这个例子里边

我们可以看到呢

在类A和类B之间建立了依赖关系

类A依赖于类B 为什么呢 是因为在类A的操作op1里边

它包含了一个局部变量

这个局部变量的类型是类B

或者换句话讲 就是在op1的操作里边

他用到了一个局部变量 这个局部变量是类B的对象

在这种情况下 类B对于类A来讲是局部变量可见

所以他们之间是一种依赖关系

第2种呢 是参数可见

或者称之为参数依赖

那么同样的 在类A里面的操作op1里面

它有一个参数

这个参数它的参数类型是类B

所以在这种情况下

他俩就符合参数可见

或者称之为参数依赖

第3个呢 是全局可见

在全局可见里边 类A的op1操作里边

他用到的一个全局变量或者全局操作

这个全局变量或者全局操作的类型是类B

在这种情况下 他俩之间就属于全局可见

如果说两个类的对象之间是一种稳定的持久的关系

我们就称之为关联关系 我前面举的例子

这个学生和导师之间从入学到毕业

它都是稳定的关系 所以它都属于关联关系

否则如果他们两个对象之间

他们的关系是时间很短的

或者是瞬态的或者短时期的

那么这种关系都属于依赖关系

在依赖关系里面 我们进一步来区分

如果需要多个对象共享同样的一个实例

比如说 多个A的对象

需要用到同一个B的对象

那么在这种情况下 我们应该把它设计成参数依赖

或者说是全局依赖 比如说我们创建一个类B的对象

我们把它作为参数传递类A的操作

然后这样建立A和B之间的这个参数依赖

当然他可以给多个这个类B的对象传同一个类B的对象实例

这样的话可以在多个类A的实例里面去共享同一个类B的实例

否则如果每一个类A的对象都需要不同的类B的对象

我们就把他可以定义成局部可见 或者说局部依赖

在设计依赖关系的时候

我们要考虑这种关系的代价

每一次我们创建一个对象

销毁一个对象都需要花费大量的系统资源

所以我们尽量的应该选用像参数依赖

全局可见 减少对象的创建和销毁

当然 如果实在不行

那就必须要使用局部变量可见

这是我们之前在设计阶段 我们画的类图

在之前的分析阶段 我们所画的类图里面

只考虑了类之间的关联关系

没有考虑它们之间的依赖关系 那么到了类设计阶段呢

我们除了关联关系以外 我们还需要定义识别类之间的依赖关系

下面我们看一下在设计阶段呢

我们需要定义类之间的依赖关系

在这个例子里面 我们增加定义了

注册控制器这个类

和课程目录系统接口这个接口之间的依赖关系

因为在注册器里面

我们要把这个接口作为一个全局变量要引入

另外我们还定义了在学生这个类里面

在他的操作passed里边 他的有一个参数

它是CourseOffering

课程提供这个类的对象

它提供这个类的对象

所以他们之间有依赖关系

是参数依赖 除此以外

其他的都是成员可见

也就是说是关联关系

在定义完依赖关系呢

我们在类设计阶段的对关联关系做进一步的精化

在这里我们要区分关联和聚集 关联和组合

属性和组合 导航性 关联类以及多样性设计

我们知道组合那是一种特殊的关联关系

它描述了整体和部分之间的关系

而且是部分是完全隶属于整体

是一种强烈的部分和整体之间的关系

而聚集也是一种部分整体的关系

但是在聚集情况下一个部分可以属于不同的整体

但是在组合情况下一个部分只能隶属于一个整体

所以我们首先区分它呢 要根据一个部分能属于多少个整体来区分它

如果它可以属于多个 那么它就是聚集关系

如果只能属于一个 那就是组合关系

第2个我们来区分这个聚集和组合呢

是根据它的生命周期

在聚集情况下 整体和部分之间他们的生命周期是完全独立的

也就是说没有关系 一个部分它的生命周期可以比整体早

也可以比整体晚

但是在组合情况下部分的生命周期范围

必须是在整体的生命整体范围之内的

也就是说我们创建部分这个对象的时候

他不能比整体对象创建的早

而我们销毁部分对象的时候

他的时间也不能比整体对象销毁时间晚

也就是说 整体对象生命周期范围要比部分对象生命周期范围大

要把部分包含在内

这是我们在教学系统里面我们定义的

比如学生和他的课程计划

我们只有当一个学生入学之后

我们创建这个学生对象以后

我们才能创建它的部分课程计划对象

组合和属性的具有相似性

属性的生命周期

也和对象的生命周期是完全相同的

那我们在设计的时候什么时候用属性什么时候用组合呢

一般情况下 我们都应该优先选择使用属性

但是在一些特殊情况下

比如说属性需要独立的标识

有可能多个类会用到相同的属性

属性有它内部的复杂的内部结构

或者属性有它自己的内部行为

或者属性和别的类之间可能存在关系

在这些情况下 我们都应该使用的是组合

比如在这个例子里面 我们可以看到课程计划

他是学生 每个学生都需要有的课程计划

但是课程计划有自己的属性 有自己的操作

所以我们需要把课程计划独立的定义成一个类

然后和学生这个类之间建立组合关系

再下来呢 我们来对类设计的导航性能进行精化

什么是导航性呢

导航性描述了从一个类的对象可以找到目标类

或者说另外一个类的对象

在导航性里面呢 有两种导航关系

第1种是双向的 也就是不带箭头的

第2种是单向的 表示只能从前面这个类的对象导航到后面一个类的对象

在分析阶段呢 我们可能只是识别出两个类之间有关联关系

我们可能缺省的都给他画成双向的

到了设计阶段 我们需要把那些不必要不需要的双向关系

把它简化成单向关系

比如说在这个例子里面

我们可以看到课程计划和开设的课程

在每个同学的课程计划里边 他选择了他需要上的若干门开设的课程

同样的每一门开设的课程里边

会包含被多个同学选择

也就是说会关联多个同学的课程计划

在设计阶段

我们就要区分

在课程计划和开设课程之间

是否需要一定设计成双向的

如果设计成双向的

那么要维护他们之间的这种关联关系

是非常困难的 也容易出现错误

所以我们考虑有没有可能进行的简化

比如说像第1种情况下

如果总的课程计划数量比较少

或者说我们不需要

从开设的课程里面找出

这门课程

选择了这门课程的课程计划

那么在这种情况下

我们就可以把前面的双向关系

简化成从课程计划到开展课程之间的这种单向关系

简化完单向关系之后

我们可以从中找出每个学生的课程计划里面包含哪些课程

如果我们需要判断

某一门课程是否被这个同学的课程计划里面所包含

或者说被选课 我们可以把所有同学的课程计划遍历一遍

因为总的课程计划数量比较少 这是可行的

同样的道理 如果说开设的课程数量比较少

我们就可以把双向关系简化成

从开设课程到课程计划之间的这样一种单向关系

如果说开设的课程数量也很多 课程计划数量也很多

那么在这种情况下 我们可能就不得不继续把它保留成双向的导航关系

那下来呢 我们要引入一个概念叫关联类

在两个类之间有关联关系的情况

这种关联关系本身可能会有一些特殊的属性需要描述

在这种情况下

我们可能需要定义关联类

比如说 我们的课程计划和开设课程

它们之间具有这种关联关系

我们需要记录每一名同学

他所选修的开设的课程的课程成绩

如果把这个课程成绩放到课程计划里边

我们可能无法区分这个成绩是哪一门课程的

但是如果能把它把这个属性保存在开设课程里边

我们同样没办法区分

这个成绩是属于哪个同学的

在这种情况下 我们就需要定一个新的类

来描述它们之间关联关系的特殊属性

我们称之为关联类 比如在这个图里面

我们针对主修课程定义了一个开设课程信息这样一个类

对于这个辅修课程

或者说选修课程也定了一个类似的 辅修课程的

开设课程信息的这样一个类

有了这样一个类以后呢 我们就可以用类图

一种方式在关联关系里面通过虚线引入所定义的关联类

第2种呢是直接在跟另外两个类之间通过关联关系

来引入我们刚才新定义的关联类

这两种方式都可以

接下来呢我们来讲一下类之间的多重性设计

在类之间 我们说多重性描述了一个类的对象可以关联多少个另外一个类的对象

如果他的多重性关系比较简单 是1或者0...1

那就表示一个对象最多只能关联

另外一个类的对象一个

这种情况下

我们可以直接通过指针或者引用

来指向另外一个类的对象

来实现他们之间的这种关联关系

否则如果它的多重性是多个

这样一种情况下 不能通过简单的指针和引用了

我们就需要做进一步的设计

如何来设计呢 我们就需要引入一些容器类

通过列表 堆栈 这样一些容器类

我们可以在容器里面可以放入多个所关联的类的对象的实例

从而来实现这种多重性关联 比如在这个例子里面

我们的 引入了一个 数组类 开设的课程列表的list

在这个list的容器里面

我们可以包含很多个开设的课程

这样就实现了从教师到他开设了课程之间的这样一个多个实例之间的关联关系

我们也可以把它描述成在关联关系里面通过注释的方式来说明

他们这种多样的关联关系是通过list数组的方式来实现的

在引用数组的时候呢 我们还要介绍一种叫参数化类

在容器内呢 都属于这种参数化类

什么是参数化类呢 就可以参数化类用来定义别的类

我们称之为参数化类 都是容器类

就比如说我们刚刚讲的数组

还有后面要讲的堆栈 队列等等

都是属于这种参数化类

也就是说 在参数化类里边

我们可以通过对它的形参

绑定具体的实参 可以创建新的容器类

在这个例子里边 他就说明了

上面是一个参数化类 他有他的形参

我们把它的形参了绑定实参

还可以构建一个具体的一个类

你比如说我们刚才讲的要我们创建一个容器类

创建一个数组 我们在数组里边

我们绑定了它所存放的对象是courseoffering

这样我们就创建了一个courseofferingList

这样一个courseoffering list这样一个专用的数组类

在参数化类里面 我们可以通过对参数绑定实参

可以实现 比如在这里呢

我们在list这个里面我们 绑定了一个courseofferingList这样的一个参数

我们就构建了一个新的参数化类型courseofferingList

它可以用来存放这个courseoffering对象

好 同学们 今天呢我们介绍了一下类的设计里面

对于依赖关系的设计

对关联关系的设计

以及我们对关联关系

我们需要定义的关联类

另外呢 我们介绍了一下对多重性的设计

再多重性设计里面 我们引入了容器类

为了实现容器类呢 我们介绍了一下参数化类

好 我们今天的内容就到这里 谢谢大家

面向对象分析与设计课程列表:

面向对象概述

-软件开发过程中的主要问题和好的解决方法

--软件开发过程中的主要问题和好的解决方法

--软件开发过程中的主要问题和好的解决方法

统一软件开发(RUP)

-RUP软件开发模型的特点

--RUP软件开发模型的特点

--RUP软件开发模型的特点

面向对象建模

-四个基本原则

--四个基本原则

--四个基本原则

-对象和类

--对象和类

--对象和类

-类之间的关系

--类之间的关系

--类之间的关系

需求概述

-用例模型

--用例模型

--用例模型

-用例之间的关系

--用例之间的关系

--用例之间的关系

-用例建模

--用例建模

--用例建模

分析与设计概述

-分析与设计概述

--分析与设计概述

--分析与设计概述

架构分析

-架构分析基本概念

--架构分析基本概念

--架构分析基本概念

-定义模型的高层组织结构

--定义模型的高层组织结构

--定义模型的高层组织结构

-确定分析机制、确定关键概念、创建用例实现

--确定分析机制、确定关键概念、创建用例实现

--确定分析机制、确定关键概念、创建用例实现

用例分析概述

-用例分析概述

--用例分析概述

--用例分析概述作业

-控制类

--控制类

--控制类

-用例行为和类的关系

--用例行为和类的关系

--用例行为与类的关系

识别设计类

-识别设计元素概述

--识别设计元素概述

--识别设计元素概述

-识别子系统及接口

--识别子系统和接口

--识别子系统及接口

描述运行态软件体系架构

-描述运行态软件体系架构

--描述运行态软件体系架构

--描述运行态软件体系架构

描述分布式系统架构

-描述分布式系统架构概述

--描述分布式系统架构概述

--描述分布式系统架构概述

用例设计

-用例设计描述

--用例设计描述

--用例设计描述

子系统设计

-子系统设计概述

--子系统设计概述

--子系统设计概述

类设计

-创建初始设计类、定义类操作方法

--创建初始设计类、定义类操作方法

--创建初始设计类、定义类操作方法

-定义类状态

--定义类状态

--定义类状态

-定义类之间的依赖关系、关联关系以及多重性设计

--定义类之间的依赖关系、关联关系以及多重性设计

--定义类之间的依赖关系、关联关系以及多重性设计

-定义类的泛化关系、解决用例冲突、非功能性需求

--定义类的泛化关系、解决用例冲突、非功能性需求

--定义类的泛化关系、解决用例冲突、非功能性需求

定义类之间的依赖关系、关联关系以及多重性设计笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。