4.1 什么是 ooa 为何需要 ooa?

118
4.1 什什什 OOA 什什什什 OOA? 4.2 什什什什什什什什什什 4.3 什什什什什什什什什什什什 什什 4.4 什什什什什什—什什 4.5 什什什什什什 什 4 什 什什什什什什什什什什 什什 什什什什什什什什什

Upload: abbott

Post on 19-Jan-2016

153 views

Category:

Documents


0 download

DESCRIPTION

4.1 什么是 OOA 为何需要 OOA?. 第 4 章 面向对象的分析与建模. 内容. 4.2 面向对象分析方法简介. 4.3 面向对象的分析原则和过程. 4.4 建立对象模型 — 类图 4.5 建立动态模型. 掌握. 建立两种模型的过程. 简易的开发过程. 用例图和文字描述. 类图. 序列图. 源代码. 图 4-1 简易的开发过程. 4.1 什么是 OOA (Object-Oriented Analysis)? 为何需要 OOA ?. 分析是对问题的调查 , 了解系统工作的业务过程。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 4.1    什么是 OOA  为何需要 OOA?

4.1 什么是 OOA 为何需要 OOA?4.2 面向对象分析方法简介 4.3 面向对象的分析原则和过程

内容

4.4 建立对象模型—类图4.5 建立动态模型

第 4 章 面向对象的分析与建模

掌握建立两种模型的过程

Page 2: 4.1    什么是 OOA  为何需要 OOA?

简易的开发过程

用例图和文字描述 类图

序列图

源代码图 4-1 简易的开发过程

Page 3: 4.1    什么是 OOA  为何需要 OOA?

3

4.1 什么是 OOA (Object-Oriented Analysis)?

为何需要 OOA?

面向对象的分析是 :按照对象 ( 事物、概念、实体 ) 的观点考虑问题域。

分析是对问题的调查,了解系统工作的业务过程。

Saledatetime概念记号 概念的内涵

一个 Sale代表了一次购物交易的事件 , 它有日期和时间

Sale 1Sale 2Sale

3Sale 4

概念的外延

概念应用的一组实例

OOA, 识别出问题域的不同概念 , 并用概念模型 表示是分析阶段的主要任务。

Page 4: 4.1    什么是 OOA  为何需要 OOA?

概念模型 (conceptual model): 是问题域中概念的描述 , 强调领域中的概

念 , 而不是软件实体。概念模型可以展示 : 一组概念 概念间的关联 概念的属性 在 UML 中 , 一个概念模型是用一静态结构图 (static structure diagram)来描述的。

SaledateTimePrint()

SalesDatabase

Saledatetime

真实世界中的概念( 实体 , 实体信息 )

软件制品软件类

属性为成员变量操作为成员函数

Page 5: 4.1    什么是 OOA  为何需要 OOA?

5

分析中的困难

OOA的优点

分析方法发展的必 然 :

功能分解法 数据流法 信息模拟法 面向对象方法

需要 OOA的原因 :

Page 6: 4.1    什么是 OOA  为何需要 OOA?

6

4.2 面向对象分析方法简介1) OMT(Object modelling Technique)Rumbaugh 91

2) Booch 方法(method of object analysis and design,1994 ) )

状态迁移图,时序图 系统组成结构

类图、对象图 模块图、进程图 图 4-2 Booch 方法

建立

对象模型

动态模型

功能模型

Page 7: 4.1    什么是 OOA  为何需要 OOA?

7

3) Coad & yourdon 方法 (OOA/OOD,1991)

问题论域

数据管理

人机交互

任务管理

图 4-3 Coad&yourdon 模型

类和对象层

属性层

结构层

主题层

服务层

Page 8: 4.1    什么是 OOA  为何需要 OOA?

8

称 RDD(Responsibility Driven Design) 责任驱动法建立 CRC(Class Responsibility Collaborator) 卡,

描述类及相关的协助类,共同承担的责任。

4 ) Wirfs – Brock 方法

5) Bailin 方法 也称 OOS 方法, 1989

主要是建立实体关系图 ERD ,实体数据流图 EDFD 。

6) OOSE 方法 [Jacobson ,1992] (Object oriented software engineering)

提供一套符号如 、 等描述系统

Page 9: 4.1    什么是 OOA  为何需要 OOA?

9

4.3 面向对象的分析原则和过程

超类 (super class)是一组子类的抽象 .

方法 (method):是隐藏实现过程抽象 . 操作 (operation):是一组方法的抽象 . 属性 (attribute)和关联 (association): 是实现它们基本实例变量的抽象 .

抽象、封装、继承、多态、结构化分析原则 把过程抽象 (procedural abstraction) 与数据抽象 (data abstraction)结合在一起 .

对象(object):对客观事物的抽象 .

类(class):是一种数据抽象, 即是对一组对象的抽象 .

包含作用于对象上的过程或方法抽象 .

Page 10: 4.1    什么是 OOA  为何需要 OOA?

面向对象的分析过程

建立对象 ( 概念 ) 模型 : 初始类图动态模型 ( 职责分配 ) 类图

迭代过程

问题描述 ( 用例 )

图 4-4 OO 分析过程

专家知识

什么是业务过程 ?需求分析

OOA分析

建立模型

用户、客 户开发者

领域知识 管理者

角色是什么 ?现实世界经验

Page 11: 4.1    什么是 OOA  为何需要 OOA?

11

确定类和对象 确定属性 确定关联 确定结构

4.4 建立对象模型—类图

步骤

Page 12: 4.1    什么是 OOA  为何需要 OOA?

12

4.4.1 类图 (class diagram)

概念层(Conceptual)类图描述应用领域中的 概念,一般地,这些概念和类有自然的联系,但两者并没有直接的映射关系 .

说明层(Specification)类图描述软件的接口部分,而不是软件的实现部分

实现层(Implementation)类图才真正考虑类的实现问题,揭示实现细节。

1)类的抽象层次

图 4-5 类的抽象层次 ( 是由 Steve Cook 和 John Daniels 引入的 )

Page 13: 4.1    什么是 OOA  为何需要 OOA?

13

public class Dialer

{

private Vector digits;

int nDigits;

public void

digit(int:n);

protected boolean

recordDigit(int

n);

}

类名属性 /成员变量操作 /方法

图 4-6 类的实现层

Dialer 拨号器 - digits:Vector - nDigits:int

+ digit(n:int) # recordDigit( n:int):boolean

Page 14: 4.1    什么是 OOA  为何需要 OOA?

14

2) 类图 (class diagram)及组成

类 (Class)、对象 (Object)和它们之间的 关系是面向对象技术中最基本的元素

类图是定义其他图的基础

类图技术是 OO方法的核心 类图是静态视图 , 表示类的静态结构模型 描述类和类之间的关系的图就构成了类图

Page 15: 4.1    什么是 OOA  为何需要 OOA?

15

类图包含下述内容:

o 类图可以包含注解和约束;o 类图还可以有包或子系统, 二者都用于把模型元素聚 集成更大的组快。

Class3

Class2 Class4

Class1 Interface

协作Collaboration 依赖于类 1

类 4 实现接口

图 4-7 类图包括内容

接口 协作

实现和关联关系 依赖、泛化、

Page 16: 4.1    什么是 OOA  为何需要 OOA?

16

• 类图上的关系

依赖:它表示类之间的使用关系 (包括精化、跟踪和绑定关系) 泛化:它把一般类连接到它的特殊类;

类之间的静态关系主要有:

关联:它表示对象之间的结构关系。

Page 17: 4.1    什么是 OOA  为何需要 OOA?

17

1) 什么可以作为对象

4.4.2 确定类和对象

事物

组织单位 设备

地点 / 位置

突发事件

充当角色

实实在在的事 物

其他系统

类名属性方法

图 4-8 作为对象的 事物图

Page 18: 4.1    什么是 OOA  为何需要 OOA?

18

(1) 实体 —— 对象法

2) 确定类和对象的方法

ERD(Erentity Relationship Diagrams)ORD(Object Relationship Diagrams)

转换规则 : 实体可能成为对象 简单的实体成为一个对象 复杂的实体分解为几个对象

实体关系图 语义数据模型

面向对象的程序设计语言

对象、属性、关系、结构

类结构、继承、封装、消息通信

OOA

图 4-9 实体到对象方法

Page 19: 4.1    什么是 OOA  为何需要 OOA?

19

姓名 地址 工资身份证号

为之工作

电话号 名称 地址

主要产品

ISA ISA

参 加

主 持

项目名 预算 优先级

管理

职务

产品名 成本 质量

组成

生产

部门名

图 4-10 实体关系图

员工

项目

工 人 经 理 部门

公 司

产品

Page 20: 4.1    什么是 OOA  为何需要 OOA?

20

员工姓名地址身份证号工资

公司姓 名地 址电话号主要产品雇用 解雇

项目 名称预算优先级

产品 产品名成本质量

工人 经理 部门

部门名

1..* 11..* 1..* 1..*

图 4-11 对象关系图

1

职 务

为之工作1..*

Page 21: 4.1    什么是 OOA  为何需要 OOA?

21

(2) 根据 ( 事物 ) 概念目录列表找出概念 —— 名词或名词短语作为对象

概念类目录 事例物理的或实在的对象 销售点终端 (post) 飞机规格说明、设计或事物描述 产品规则说明 航班描述地点 商店 机场事务 销售、支付、预定在线事物处理 在线销售项人的角色 出纳员 飞行员包含其他事物的包容器 商店、银行识别号 飞机被包含在包容器内的事物 销售商品项 乘客系统外部其他系统 信用卡授权系统 空中交通控制系统抽象的名词性概念 饥饿的人 恐高症组织 销售部 对象航班事件 销售、会议 出航、着陆过程 ( 有时可用概念表达 ) 出售一个产品的过程 预定一个座位的过程

Page 22: 4.1    什么是 OOA  为何需要 OOA?

概念类目录 事例

规划和策略 退货政策 取消策略目录 产品目录 零件目录财政收支、工作情况、合同等记录

收据,分类帐目,雇佣合同,维护日志

金融工具和服务机构 信用卡,股票手册、书籍 雇员手册 修理手册

销售点终端系统的概念模型销售点终端

销售项条目

商品项

出纳员

销售项 商店

顾客 管理员

销售规格说明 产品目录 支付 图 4-12 销售点终端问题域中的初始概念模型

服务员

Page 23: 4.1    什么是 OOA  为何需要 OOA?

23

(3) 使用类 — 职责—协作卡 (CRC卡进行建模 )

Class ResponisbilityCollaborator Card

类名职责 协作者

从用例出发找出类

类名:是一个名词或一个短语类的职责:是类知道并要完成 (“做” ) 的事情知道型 (knowing)职责

知道自己私有的封装了的数据 知道自己相关联的对象信息 知道自己派生或计算出来的事物

Page 24: 4.1    什么是 OOA  为何需要 OOA?

24

当类没有足够的信息来履行职责时就需要协作 ,协作必须发生在一个类需要信息的时候。

对于任何协作,总是至少有一个发起者。 有时协作者完成工作的主要部分。 协作应是直接的。 可能会产生新的职责来实现协作。

确定协作时考虑的问题

定义协作者

做 (doing)职责 自己完成某件任务 发起其他对象执行动作 控制和协调其他对象内活动

Page 25: 4.1    什么是 OOA  为何需要 OOA?

25

注册讨论班的 CRC卡

学生姓名地址电话邮件平均分验证确定信息提供参加讨论班类表

注册记录

注册讨论班 (UI)

** 参阅原型 **请求确定学生信息启用讨论班搜索信息显示讨论班列表显示讨论班费用显示教授信息

学生讨论班教授

学生 (Actor)

提供自己的信息请求注册讨论班请求成绩单

注册讨论班成绩单

安全登陆 (UI)** 参阅原型 **请求学生确认信息 学生

教授姓名地址电话邮件薪水提供信息指导的讨论班

讨论班

Page 26: 4.1    什么是 OOA  为何需要 OOA?

26

注册讨论班的 CRC卡讨 论 班

名称讨论班编号费用等待列表注册学生导师添加学生撤销学生

学生

教授

成 绩 单 (UI)

** 参阅原型 **获得学生信息获得学生参加讨论班的信息确定平均分输出成绩

学生讨论班教授

注册记录注 册 记 录获得的分数平均截至日期最终成绩学生讨论班

Page 27: 4.1    什么是 OOA  为何需要 OOA?

(4) 去掉无用的类和对象* 去掉冗余的类和对象 * 不考虑与本问题无关的类和对

象* 不考虑和实现有关的类和对象* 去掉模糊概括的类

* 不要把概念当作属性火车订票系统中的目的地是车次的属性还是概念 ?

SaleDatabase Saledatetime

SaledateTimePrint()真实世界中的

概念 ( 记号 )软件制品 , 不是概念的一部分

软件类 ,不是概念的一部分

* 区分领域中的系统分析员观察世界所得到的真实概念 ( 是对问题内事物的描述 ) 和软件设计人员描述软件实体 所使用的概念 , 是从不同视觉出发而得到的。

Page 28: 4.1    什么是 OOA  为何需要 OOA?

28

POST

Sale

1

*

Register

Sale

1

*

图 4-13 具有不同名称的类似概念

登记薄

* 怎么选择相近的概念?

Register这个概念可以代替 POST?

Register更为抽象一些 , 如果从软件的实现和模型的抽象相分离为目标来建立模型 , Register也是有用的 , 这个术语也有了普遍意义了。

POST是一个领域常见的术语,从熟悉和传达信息角度 ,

是个有用的记号。

Page 29: 4.1    什么是 OOA  为何需要 OOA?

29

3) 3) UML可描述三个主要的类 (1) 边界类 (boundary)

用户 外部系统

用户界面用户界面 外部系统接口外部系统接口

用例

边界类用于描述外部参与者与系统之间的交互 . 一个参与者与一个用例之间的交互对应一个边界类 .

边界类包括 : 用户界面 : 描述用户与系统之间的交互 , 而不是 显示形式 , 如按钮、菜单等 . 系统接口、设备接口 : 描述所定义的通信或交换 协议 , 而不是说明协议如何实现的 .

Page 30: 4.1    什么是 OOA  为何需要 OOA?

30

LoginForm 注册用户进行登录的操作界面

注意 : 边界类关注参与者与用例之间交互的信息或响应的 事件 , 不描述窗口组件等界面的组成元素 .

例 : MiniLibray 边界类

若两个用例同时与一个参与者交互 , 可能会共用一个 边界类 .

分析阶段 , 应使用用户的术语描述界面 .

BrowseForm 注册用户进行查询浏览的操作界面 MakeReservationForm 普通读者预订图书的操作界面

Page 31: 4.1    什么是 OOA  为何需要 OOA?

31

(2) 控制类 (Control)

用户 外部系统

控制逻辑

用例

控制类 : 用于描述一个用例所具有的事件流控 制行为 , 它本身不处理具体的任务 ,而 是调度其它类完成具体的任务 . 控制类 , 隔离和协调了边界类和实体类 .

Page 32: 4.1    什么是 OOA  为何需要 OOA?

32

BrowseCountrol 负责执行注册用户的查询浏览

注意 当用例比较复杂时 ( 如有分支的事件流 ) ,一个用例可 以有多个控制类;

例 : MiniLibray 控制类

当用例事件流逻辑结构十分简单,则没有必要使用控 制类,可用边界类实现用例的行为,如“登录”。 一般一个用例对应一个控制类,若不同用例包含的任 务之间存在紧密联系,则这些用例可共用一个一个控制类 .

MakeReservationControl 负责执行普通读者的预订图书 RemoveReservationControl负责执行普通读者的取消预订

Page 33: 4.1    什么是 OOA  为何需要 OOA?

33

(3) 实体类 用例中的参与对象 , 对应现实世界中的事物 . 实体类用于描述必须存储的信息及其相关行为 .

注意实体类的识别质量取决于文档的风格和质量自然语言描述不精确 , 注意文档用辞规范自然语言描述中 , 名词对应类、属性或同义词等 , 要进一步筛选 .

MiniLibray 实体类: BorrowerActor 借阅者 BorrowerInfo 普通借阅者的基本信息 Loan 普通借阅者的借书记录 Librarian 图书管理员

Page 34: 4.1    什么是 OOA  为何需要 OOA?

(1) 简单的数据类型 : 数字 Number、字符串 String 、布尔值Boolean、

日期 Date 、时间 Time 、文本 Text等(2) 其他常见的类型 : 地址 Address、颜色 Color、几何元素 Geometrics

、 电话号码 PhoneNumber、通用商品代码 UPC、 社会安全代码 Social Security Number、 邮政编码 Postal Code 、枚举类型等

4.4.3 确定类和对象的属性 (attribute)

属性 : 是某个对象的逻辑数据值 SaledatastartTime: Time

1) 属性类型

Page 35: 4.1    什么是 OOA  为何需要 OOA?

35

(3) 描述型 (descriptire)

(4) 定义型(definiton)(5) 恒定派生型 (always derivable)(6) 偶然派生型 (occasionlly derivable)(7) 单值属性(8) 互斥值属性(9) 多值属性(10)非简单的数据类型 : 电话号、人名、安全号、 促销价格 ( 开始、截止日期 ) 、 支付金额有货币单位

date/total (派生的属性 )

time

Sale

Page 36: 4.1    什么是 OOA  为何需要 OOA?

36

2) 属性的特点

利用可见性控制外部事物对类中属性的操作方式

能被系统中任何操作查看,修改

属性仅供自身的类及子类操作

可见性 (visibility)

+ 公有的 (public)

#保护的 (protected)

该属性仅在自身类内被使用-私有的 (private)

Page 37: 4.1    什么是 OOA  为何需要 OOA?

37

3) 注意(1) 误把对象当作属性

Storeaddress:Address

(2) 不要把链上的属性当作属性

Store Address* 1

(3) 不要把限定词当作属性

人员

程序语言

项目

程序语言 项目 人员

Page 38: 4.1    什么是 OOA  为何需要 OOA?

38

注意(4) 一个类的属性,应当对该类的每一个实例都适用

(5) 可用一个属性代替同意下的分散属性人员

(6) 若有一个对象,仅有一个属性,可将该属性移到 有实例关系关联的对象上 (7) 底层对象共有的属性,应放在上层对象中定义, 而底层只定义特有的属性(8) 使用关联而不使用属性来表达概念之间的联系

CashiernamecurrentPOST

不是简单属

Cashier

name

POST

number

Uses

1 11差 好

图 4- 14 用关联表达概念之间的联系

性别籍贯

Page 39: 4.1    什么是 OOA  为何需要 OOA?

销售点模型的属性

图 4-15 销售点终端有属性的概念模型

POST Item Cashier Customer

Sale

address: Addressname:Text

datd:Datatime:Time

SalesLineitem

Payment

quantity:Integer

amount:Quantity

Store Product Catalog

ProductSpecificationdescription:Textprice:QuantityUpc:UPC

Manager

Page 40: 4.1    什么是 OOA  为何需要 OOA?

40

关联是不同对象或类之间有意义的结构化关系。

4.4.4 对象或类的关联 (object or class

Association)

public class Phone{ private Button itsButtons[15] } 关联上标注的名称与用来保存引用变量的名称是一致的。

Phone Button15

itsButtons

在类图中, 关联是一种简单的数据关系。 ( 用一条把类连接在一起的实线或带箭头的单向实线表示 )

在程序中 , 关联常常表示拥有对其他对象的引用 的实例变量。 在 Java中 , 通常用Vector、 List或其他某种容器类型来实现多元关联。

Page 41: 4.1    什么是 OOA  为何需要 OOA?

41

1) 关联描述的属性

company person

关联的基数

关联的角色 (role): 一个对象上下文含义

1

employer

1..*

employer

Works for

图 4-16 关联属性

人 小汽车拥有

被拥有

1..* 0..*

0..110..*1..*

n0..n1..n

多重性(Multiplicity)

关联的元素

导读箭头 , 表示方向 ,( 经常被省略 )

多重性 : 一个类型 A 的实例在一个特定时间里能够和多少个类型B 的实例发生关联

Page 42: 4.1    什么是 OOA  为何需要 OOA?

(1) 连接线的几种情况 :

A B

C D

E F

G H

I J

× ×

×

双向有导航的关联不具有导航的关联

单向关联 ,仅由 G 导航到H

双向 ( 无导航的 ) 关联

单向导航的关联 ,(I端没决定可否导航 )

分析

设计

图 4-17 连接线的几种情况

Page 43: 4.1    什么是 OOA  为何需要 OOA?

(2) 多重性( multiplicity):

SalesLineItem Item

0..1 1

Records- sale-of 每一行记录一个

单独商品的售销项

SalesLineItem Item

0..1 1..*

Records-sale-of

每一行记录一组相同商品的售销项

SalesLineItemquantity

Item0..1 1..*

Records-sale-of

根据多重性的取值派生而来的属性

图 4-18 在一个售销项记录中记录商品项的数量

指出可被允许生成的实例 (instance)数量。

Page 44: 4.1    什么是 OOA  为何需要 OOA?

(3) 角色

图 4-19 作为概念的角色

有两种方式对一个现实世界中的角色—尤其是一 个人的角色建模 .

Store Manager1 *

CashierManager

1

1

**

Employs

Employs

# 作为概念的角色在增加独特的属性、关联方面提供 了方便性和灵活性。角色作为分离的类来实现更容 易 ( 语言限制 , 不方便动态地将一个类的实例变异为 另一个类的实例 , 或随着一个人的角色改变而动态地 增加属性和行为 ) 。

Page 45: 4.1    什么是 OOA  为何需要 OOA?

# 关联中的角色

图 4-20 关联中的角色

Store Person1 *manager

1

1

*

*

Employs-to- manage

worker

关联中的角色以一种较精确的方法表达了一个人相同实例在不同关联中表现为多重 ( 以及动态改变 ) 角色的概念。一个人 , 同时或按次序地可能表现为教师、技师、父亲等角色。

Employs-to-handle-sales

Manages

manager

cashier

Page 46: 4.1    什么是 OOA  为何需要 OOA?

46

2) 关联的几种情况(1) 递归关联 (Recursive Association) 关联的两端使用同一个类

类在关联中以不同角色出现

图 4-21 类的自身关联

经理

* 工人职员雇主

0..1 管理

二元树节点

1 *名称地址

职员名 称地址 职 位工 资

BinaryTreeNode

public class BinaryTreeNode{ private BinaryTreeNode leftNode; private BinaryTreeNode rightNode;}

公司

Page 47: 4.1    什么是 OOA  为何需要 OOA?

47

(2) 关联的导航性 (navigability) 表示对一个类有用的状态信息

图 4-22 导航性

关联的几种情况

(3) 关联次序 ( 对多关联的多端对象进行排序 )

0..*

{ 按时间排序 }

图 4-23 关联次序

不可导航 , 产品未存储订单信息 , 要搜索产品 , 才能找到订单。

1..*客户保险合同

order * product*Line item

order * product 每一个订单都有对应的产品列表

*Line item

Page 48: 4.1    什么是 OOA  为何需要 OOA?

对限定关联 (qualified association)的考虑 :

主要是减少限定符远端处的多重性 , 从多个减少到 1 个。分析类图中的限定符只是区分两种不同类型的事物。

(4) 关联的限定符关联的几种情况

ProductCatalog 1..*1

Contains ProductSpecification

ProductCatalog

1UPCProduct

Specification1

产品代码

限定符并没有增加有用的信息 , 明智的使用 , 增加对问题的理解。 图 4-24 增加类的限定

Page 49: 4.1    什么是 OOA  为何需要 OOA?

49

(5) 有约束的关联关联的几种情况

保险合同 保险公司

1 0..*

公司

0..*

1..*

{OR}

0..*

1..*

图 4-25 有约束的关联

保险合同

人 公司 图 4-26 用继承表示 有约束的关联

Page 50: 4.1    什么是 OOA  为何需要 OOA?

50

(6) 依赖关系 (dependency relationship)

seminar《 UI 》

EnrollInseminar

图 4-27 有依赖关系的关联

(7) 含有子集的关联

公司的职员职员公司

1

1 *

*

{ 子集 }公司的股东

图 4-28 有子集的关联

关联的几种情况

Page 51: 4.1    什么是 OOA  为何需要 OOA?

51

StringAddress1

Vector

* itsLines

public class Address { private Vector itsLogs;}

源类包含了一个对关联类的引用 , 而关联类又包含了对目标类的引用

关联的几种情况(8) 关联类 —— 即是关联,又是类

图 4-29 关联类

personcompany1

Job

Salary

0..*

employer

employer

boss

0..1

*worker

Page 52: 4.1    什么是 OOA  为何需要 OOA?

52

关联类和具体化的关联之间区别

personcompany*

图 4-30 具有属性的关联类

Stock 股份 quantity

*Holding 持有 owner

PersonCompany1

图 4-31 具体化的关联

Stock Purchase 购 买

quantitydatecost(价格 )

*holding owner

* 1

注意注意

Page 53: 4.1    什么是 OOA  为何需要 OOA?

53

(9) N元关联 (n-ary association)

语言 项目

图 4-32 n元关联多重性

人员

professorcourse

student

registration

**

0..1

关联的几种情况

Page 54: 4.1    什么是 OOA  为何需要 OOA?

54

程序语言

人员

程序语言

项目

项目 人员

语言

任务项项目名

人员语言

1 1..n1..n 0..n

1..n 1..n

解决多对多的关联是将其化简为二元关联 .

用词组通过 限定词方式 :建立链上的属性 :

增设具体的类 :

图 4-33 化简 n元关联

项目 人员

Page 55: 4.1    什么是 OOA  为何需要 OOA?

55

(10) 关联的构造型

B A

关联的几种情况

在关联上标注构造型,改变其意义。《 create 》 public class A{

public B makeB() { return new B (); }}

《 create》构造型表明源对象创建了目标对象 , 然后把它传递给系统其他部分

A B《 local 》

《 local》构造型表明源类对象创建了目标类对象实例 ,并把这个实例包含在一个局部变量中

public class A{ public void f () { B b = new B ();//use b }}

Page 56: 4.1    什么是 OOA  为何需要 OOA?

56

B A

关联的几种情况

《 parameter》 《 parameter》构造型表

明源类对象通过它的某个成员函数的参数得以访问目标类对象实例 ( 一旦该成员函数返回 , 源类就会把这个对象忘掉 , 目标实例不保存在实例变量中

A B《 delegate》委派

《 delegate》构造型表明源类对象把一个对于成员函数的调用传给目标类对象

public class A{ private B itsB; public void f () { itsB.f(); }}

public class A{ public void f (B b) { //use b }}

图 4-34 关联的构造型

可省略

Page 57: 4.1    什么是 OOA  为何需要 OOA?

57

3) 建立关联(1)初步确定关联

(2) 筛选、精减关联(3) 进一步完善关联

根据“用况”的描述或问题陈述, 提取动词短语,得出关联。找出需求陈述中的隐含关联根据问题域知识得出隐含关联

A 在物理上或逻辑上是 B 的一部分 A 在物理或逻辑上包含在 B 中 / 依赖于B A 被记录在 B 中 ( 见下页通用关联列表 )

Page 58: 4.1    什么是 OOA  为何需要 OOA?

58

分类 例 : 关联A 在物理是 B 的一部分 机翼 -- 飞机A 在逻辑是 B 的一部分 航班路线 -- 航班 销售项条目 -- 销售项

A 在物理包含在 B 中 / 依赖于 B 乘客 -- 飞机 商品项 -- 商品架

A 在逻辑包含在 B 中 航班 -- 航班时刻表 商品项目描述—目录

A 是对 B 的描述 航班描述 -- 航班 商品项目描述—商品项A 是事务 B 或报告B 的一个记录项

维护作业 --维护日志 销售项条目 -- 销售项

A 为 B 所知 /A 录入 B 中 订票单 --旅客名单 销售项 -- 销售终端A 是 B 的一个成员 飞行员 -- 航空公司 出纳员 -- 商店A 是 B 的一个组织单位 维修厂 -- 航空公司 商店一个部门 -- 商店A 使用或管理 B 飞行员 -- 飞机 出纳员 --POST

A 与 B 相互通信 机票代理社 -- 乘客 顾客 -- 出纳员A 与一个事务 B 有关联 乘客 -- 飞机 顾客—付款A,B都是事务 , 二者有关联 订票 --送票 付款 -- 销售项

Page 59: 4.1    什么是 OOA  为何需要 OOA?

注意 :

在建立关联时 , 要注意有记忆一段持续时间 的关联 ( 需要知道型关联 ) 。 识别概念比识别关联更为重要。

减少派生关联

避免关联之间的信息冗余

Page 60: 4.1    什么是 OOA  为何需要 OOA?

用关联来联系两个概念 ,而不是用属性来联系它们

两个类之间可能有多重关联关系,用标签标示出来。如下面的班机和机场,标签是飞行

多重性 (multiplicity)是由语境来决定的。

注意

Company PersonWorks-for1..* 0..*

一个人的实例是为一个还是多个公司的实例工作取决于模型的语境

税务部门会对多个公司感兴趣 ; 一个协会可能只对一个公司感兴趣

Flight AirportFlying-to

1

0..1Flying-from

**

图 4-35 类之间的多重关联关系

Page 61: 4.1    什么是 OOA  为何需要 OOA?

例 , 销售点模型的关联

图 4-36 销售点终端有属性的概念模型

POST

Item

Cashier

Customer

SalesLineitem

quantity

Saledatdtime

addressname

Store

Payment

amount

Product Catalog

Manager

ProductSpecification

descriptionpriceUPC

0..1

*

1..*1

11

11

1 1

* 1

1

1

*

*1

1 1

1

*

1..*

1

11

Records-sale-of

Described-by

Stocks

Used-byDescribes

Houses11..*

Logs- completed

Contained-in

Captured-on

Started-by

Record-sales-on

Initiated-by

Paid-by

Page 62: 4.1    什么是 OOA  为何需要 OOA?

62

例 基于 CRC模型的一个学生注册 UML类图Security login 《 UI 》

acceptstudentID()acceptstudentName()

validatestudent()

EnrollmentRecordmarksReceived

getAverageToDate()GetFinalMark()

Transcript 《 UI 》

getstudent()getseminars()

determineAverage()output()

Studentname

addressphonenumberemailaddress

studentnumberaveragemark

isEligible(name,studentNumber)

getseminarstaken()

Seminarname

seminarnumberfees

waitinglist

EnrollinSeminar 《 UI 》

searchforseminar()displayseminarlist()displayseminarfees()

displayprofessor()

Professorname

addressphonenumberemailaddress

salsry

addstudent(student)dropstudent(student)

getInformation()

onwai-tinglist

enrolled in

instructs

enrolled in

图 4-37 基于 CRC 卡的类图

Page 63: 4.1    什么是 OOA  为何需要 OOA?

63

修改后的类图

Student Seminar

Professor

图 4-38 修改后的类图

Enrollment-Record

enrolledin1..* 1

enrolledin注册

1 1..*

0..*

instructsOn waiting list

0..*{ordered,FIFO}

按序放在排列表上

0..*

0..1

Page 64: 4.1    什么是 OOA  为何需要 OOA?

64

进一步考虑

Student

Professorname

phonenumberemailaddress

salary

getInformation()purchasepar-kingpass()

getfullname()getcoursenumber()setcoursenumber

(number)getfees()

setfees(amount)getname()

setname(name)

namecoursenumber

fees

图 4-39 修改后的类图

Seminar Course

enrolledin1..*

enrolledin 注册1 1..* 1

offering

0..*

On waiting

livesat

0..1

livesat

1

0..1

0..1

Enrollmentrecord

mentors0..1

0..*

0..*

associate

0..*

Address street city state Postalcode countryvalidate()outputAsLabel()

0..*{ordered,FIFO}

assistant 0..1{or}

instructs

0..*

Page 65: 4.1    什么是 OOA  为何需要 OOA?

65

对象或类是个封装体。关联存在于对象之间。  关联描述系统对象或实例间的离散连接。 有了关联,使得对象不但要了解自己还要了

解 有关联的对象。        

小 结

分析阶段 , 关联表示对象之间的逻辑关系 , 没 有必要指定方向 , 尽量避免多余的关联 ( 因为 它们不会增加任何逻辑信息 ) 。 分析中关联不是对数据流、实例变量或对象 连接一条声明 , 符合实际情况即可。

Page 66: 4.1    什么是 OOA  为何需要 OOA?

66

设计阶段 , 关联用来说明关于数据结构的设计 决定和类之间职责的分离 , 关联方向很重要。 为了提高对象存取效率和对特定类信息 的定位 , 可以引入一些多余的关联。 关联的导航性也很重要。 关联可用指针实现。

Page 67: 4.1    什么是 OOA  为何需要 OOA?

67

和关联相关的概念 类和对象 关联的标签 : 任选项 ,描述类关联的词 关联的角色 : 关联中对象所取上、下文含义 关联的多重性指示器 : 基数 (cardinality)— 关联中表示概念“多少” 选择性 (optionality)— 关联中概念“是否需要” 双向关联 : 两个方向转移的关联 ( 互相发送消息 ) 单向关联 : 仅一个方向转移的关联 ( 单向发送消息 ) 关联的导航性 : 关联只能在一个方向上遍历 递归关联 : 关联的两端使用相同的类

Page 68: 4.1    什么是 OOA  为何需要 OOA?

68

关联的次序 : 对多关联的多端对象进行排序 关联的限定符 : 从一组相关的对象中标出 独特的对象 有约束的关联 : 多个关联连到同一个基类 , 在 约束下使基类一个实例与另一个类联系 含有子集的关联 依赖关联 : 两个对象不存在持久关联 , 但需要 协作 关联类 : 即是个关联又是个类 N 元关联 : 一个类在关联的多个位置上出现

Page 69: 4.1    什么是 OOA  为何需要 OOA?

69

4.4.5 类的依赖关系

有两个元素 X 、 Y ,如果修改元素 X 的定义可能会引起对另一个元素 Y 的定义的修改,则称元素 Y 依赖 (Dependency)于元素 X 。

1)含义 : 表示两个或多个模型元素之间语义上的关系

客户以某种形式依赖于提供者

图 4-40 类的依赖关系

轿车经销商 汽车工厂

轿车 卡车

客户 提供者依赖

Page 70: 4.1    什么是 OOA  为何需要 OOA?

Timer

attach(Timer observer obs) detach(Timer observer obs)notify()

Sprite

inplay Position ( ):cpoint

tick ( )

Flay field

Cpoint

撞击者

0..1

被撞击者

0..1

Velocity Movable sprite

tick ( ) move ( )

Stationary sprite

观察者

图 4-41 对象的连接方式

2) 引起依赖 的原因

一个类向另一个类发送消息 一个类是另一个类的数据成员 一个类是另一个类的某个操作参数类型

Timer observer

tick( )

Page 71: 4.1    什么是 OOA  为何需要 OOA?

71

(1) “使用 (use)”依赖表示客户使用提供者提供的服务以实现它的行为 .

包括 :

3) 依赖关系分类 使用依赖( Usage) 抽象依赖( Abstraction)

授权依赖( Permission) 绑定依赖( Binding)

# 实例化《 instantiate》 声明用一个类的方法创建了另一个类的实例

# 调用《 call》 :声明一个类调用其他类的操作的方法

# 参数《 parameter》 : 声明一个操作和它的参数之间的关系# 发送《send》 :声明信号发送者和信号接收者之间的关系.

Page 72: 4.1    什么是 OOA  为何需要 OOA?

如 , 结账 (check out)类依赖 (dependency)于 信用卡 (credit card)类

credit card

check out

dependency

图 4-42 依赖关系

Page 73: 4.1    什么是 OOA  为何需要 OOA?

73

(2) 抽象依赖表示客户与提供者之间的关系,依赖于在不同抽象层次上的事物包括 跟踪《 trace》 精化《 refine》 派生《 derive》

Page 74: 4.1    什么是 OOA  为何需要 OOA?

74

类之间的关系

表达一个事物访问另一个事物的能力,包括 : 访问《 access》

允许一个包访问另一个包的内容 导入《 import》

允许一个包访问另一个包的内容并为被访问包的组成部分增加别名

友元《 friend》 允许一个元素访问另一个元素,不管被访问的元素是否具有可见性

(3) 授权依赖

Page 75: 4.1    什么是 OOA  为何需要 OOA?

75

(4) 绑定依赖 较高级的依赖类型,用于绑定模板以创建新的模型元素 . 绑定《 bind》

类之间的关系

图 4-43 绑定依赖

《 bind 》《 bind 》

用类属性模拟类属类列表继承

长度

类型 列表

整数列表 人员列表

Page 76: 4.1    什么是 OOA  为何需要 OOA?

依赖关系种类小结关系 功能 关键字访问 允许一个包访问另一个包内容 Access

绑定 为模板参数指定值以生成一个新的模型元素

Bind

调用 声明一个类调用其他类的操作方法 Call

导出 声明一个实例可以从另一个实例中导出 Derive

友元 允许一个元素访问另一个元素 Friend

引入 允许一个包访问另一个包内容并为访问包的组成部分增加别名

Import

实例化 关于一个类的方法创建类一个类实例的声明

instantiate

参数 一个操作和他的参数之间关系 Parameter

发送 信号发送者,接收着之间关系 Send

Page 77: 4.1    什么是 OOA  为何需要 OOA?

4.4.6 类的接口 (interface)接口如同契约。

ProximitySensor 图 4-44 接口的表示

activate()read()

《 interface 》 ISensor

TheftAlarm《 use 》

interface ISensor {……..}public class ProximitySensor implements ISensor {……}

ProximitySensor

TheftAlarm

供给接口

需求接口

ISensor

实现接口

使用接口

Page 78: 4.1    什么是 OOA  为何需要 OOA?

类的关联4.4.7 整体-部分的关联关系 (“部分 IS PART OF 整体” )

1) 聚合 (aggregation)关系

segmentPath

图 4-45 聚合

Course( 课程 )

Program( 课程计划 )

1..*0..*

0..* 0..*Recommended for

推荐

employee( 雇员 )

Team( 团队 )

1..*0..*

0..1

0..*subteam

部分 部分

* *{ordered}

Page 79: 4.1    什么是 OOA  为何需要 OOA?

79

(2) 整体部分的重数可为任意,部分对象可是任 意整体对象的一部分

(1) 用 表示聚集 , 即整体-端。

(3) 聚合即关联,显示多重性和角色

(4) 聚合是关联的一种泛化,其实现与关联不易 区分

说明

Whole Partpublic class Whole{ private Part itsPart

}

1..* *

Page 80: 4.1    什么是 OOA  为何需要 OOA?

80

a:Container

e:Icon

b:Container

f:Iconh:Icon

c:Container

d:Container

g:Icon

增加存储负担,指针危险,被遗弃对象危险。

(5) 聚合链组成有序对象图

图 4-46 聚合链有序对象图以下情况不允许 :

X Y Z

图 4- 47 实例间的非法聚合循环

A

B C

Page 81: 4.1    什么是 OOA  为何需要 OOA?

81

2) 组合 (Composition)关系

部分对象被嵌入到整体对象中

Engine( 引擎 )

Airplane( 飞机 )

Component( 组件 )

Product( 产品 )

1..*0..1

assembly( 装配 )

0..*

0..*

subassembly

部分部分

整体

图 4- 48 组合关系表示

WardOwner

public class Owne{ private Ward itsWard}

1..*

Page 82: 4.1    什么是 OOA  为何需要 OOA?

82

(2)整体对象重数只能为 1 或 0..1,部分对象重数任意

(1) 用 表示组合的整体部分

(3)可以构成多层组合

说明

Company Division Department1 *1 *

图 4-49 多层组合

(4)实例间的非法聚合情况,也适用于组合

图 4-50 非法的实例组合

Letter Autograph Transaction

Page 83: 4.1    什么是 OOA  为何需要 OOA?

83

3) 发现聚合、组合关系客观世界存在聚合、组合关系组织结构的上下级关系事物的包容性抽象事物的整体-部分关系具体事物和它的某个抽象方面建立关联的思想适用于聚合与组合部分的创建和删除依赖于整体整体的操作传递给部分 ( 如销毁、移功、记

录 )

Page 84: 4.1    什么是 OOA  为何需要 OOA?

84

4) 验证、检查聚合、组合关系

这种关系是否属于问题域

整体和部分关系是否明显

是否是系统责任的需要

部分对象是否有一个以上的属性

Page 85: 4.1    什么是 OOA  为何需要 OOA?

85

:}{:

:}{:

1..*

11..4

5) 聚合、组合关系的用途清晰表达问题域中事物的复杂关系简化对象定义

图 4-51 简化对象的定义

飞机飞机

发动机 导航仪

在确定解决方案阶段 ,要知道部分和整体的生命周期运用到整体的操作 ( 复制或删除 ) 常常必须传递到部分

Page 86: 4.1    什么是 OOA  为何需要 OOA?

86

4.4.8 结构关系 泛化 (generalization)关系 --分类关系

图 4-52 泛化表示

Employee

• 泛化使得多态操作得以实现1) 泛化的用途• 继承机制得以实现

SalariedEmployee

public class Employee{ ……}public class SalariedEmployee extends

Employee

{ ……}

Page 87: 4.1    什么是 OOA  为何需要 OOA?

87

图 4-53 抽象类的继承

Orderdate:DateConfirm()

MailOrderdatefilled:DateConfirm()

BoxofficeOrderhold:BooleanConfirm()

public abstract class Order { private date Date; public abstract void Confirm();}public class MailOrder extende Order{}

抽象类的继承

Page 88: 4.1    什么是 OOA  为何需要 OOA?

88

Person{abstract}

namephoneNumberemailAddress

purchaseParkingPass()

Professor

salary

getInformation()

student

studentnumberaveragemark

is eligible(name, studentNumber)getSeminarsTaken()

Address

streetcitystatepostal codecountry

validate()outputAsLabel()

livesat

0..1

1..*

图 4-54 有关联的类的继承

有关联的类的继承

这个图有什么问题 ?

Page 89: 4.1    什么是 OOA  为何需要 OOA?

售点终端 Payment(支付 ) 类的继承关系

Paymentamount:Money

CashPayment

CreditPayment

CheckPayment

Cash(现金 ) 、 Credit (信用卡 ) 、 Check(支票 )

CreditCard Check

Sale

1 * 1

1Pays-for1

Paid-withIdentifies-Credit-with

图 4-55 Payment( 支付 ) 类的继承关系

Page 90: 4.1    什么是 OOA  为何需要 OOA?

90

2) 发现泛化关系 应具有领域的分类知识。 按常识考虑事物的分类。 寻找已有的类:继承定义 ( 是一个、相似、分类 ) ; 包含关系;领域重用等

公司人员 姓名身份证号

股东 股份…

职员 工资…

公司人员 姓名身份证号工资级别股份

自顶向下

发现具体类( 演绎思维 )

图 4-56 从一般类发现特殊类 ( 具体类 )

Page 91: 4.1    什么是 OOA  为何需要 OOA?

91

自低向上发现一般类

( 归纳思维 )

图 4- 57 从特殊类发现一般类

股东 职员姓名身份证号股份

姓名身份证号工资

公司人员姓名身份证号

股东股份…

职员工资…

Page 92: 4.1    什么是 OOA  为何需要 OOA?

92

为支持复用..

..

图 4-58 支持复用的 类继承结构

收款机

现金收款机 信用卡收款机

信用卡、现金两用收款机

现金收款机

Page 93: 4.1    什么是 OOA  为何需要 OOA?

93

3) 单一继承和多重继承

单一继承 (single inheritance) 类直接从唯一的一个类继承。多重继承 (multiple inheritance) 类直接从一个以上的类继承。

4) 优化结构审查、调整结构精简特殊类

Page 94: 4.1    什么是 OOA  为何需要 OOA?

94

(1) 取消无特殊属性和服务的特殊类

取消大学生类

研究生

图 4 - 59 精减特殊类

姓 名学号班级

研究方向指导教师

研究生

学生

研究方向指导教师

姓名学号班级

学生

大学生

Page 95: 4.1    什么是 OOA  为何需要 OOA?

95

(2) 取消差别不大的多个特殊类 , 将其属性 和服务放在一般类中

图 4-60 精减特殊类

取消特殊类

增加一般类属性服务人员

男人 女人 中国人 外国人

性别籍贯

人员

Page 96: 4.1    什么是 OOA  为何需要 OOA?

96

(3) 取消用途单一的一般类

设备型号生产 厂商开启关闭

取消设备类雷达

型号生产厂 商安装地 点

开启关闭 监控

图 4-61 取消用途单一的一般类

监控

雷达安装地点

Page 97: 4.1    什么是 OOA  为何需要 OOA?

97

(4) 多重继承中的冲突问题

图 4-62 多重继承同名属性问题

• 注意命名的冲突 ( 重新 命名或改变作用域 )• 注意通过多条路径共享被继承的属性的冲突

(C++ 实现中使用虚基类 .虚基类的属性是在一个类通过多重继承的路径继承时才是共享的 .在职研究生类只继承人员类属性集 .虚基类效率低 .

Java 接口类型不包含实例属性 ,因而不会产生共享属

性时所导致的复杂性 .

所从事学号班级 专业

职称 专业

所学

教职工研究生

在职研究生在职单位

人员姓名身份证号

Page 98: 4.1    什么是 OOA  为何需要 OOA?

98

(5) 减少继承的层次 (inheritance hierarchy)

人员 人员类型

研究生 在职研究生教职 工

1 *

用关联减少继承的层次

人员 人员类型

研究生 在职研究生 教职工

用聚合关系减少继承的层次

图 4-63 减少继承的层次几种情况

1 *

Page 99: 4.1    什么是 OOA  为何需要 OOA?

99

支持复用:类的复用 从已有类分离出属性和服务

机床

车床 刨床洗床

起重机 送料车

电动机 0..1

0..10..1

图 4-64 支持复用

(6) 继承与聚合、组合的联合

Page 100: 4.1    什么是 OOA  为何需要 OOA?

100

适用于动态变化的对象特征—— 分离动态改变的属性和服务 , 组成部分对象

身份

经理身份

图 4-65 支持动态变化对象特征

人员

营业员身份 会计师身份

人员

营业员身份 经理身份 会计师身份

改进1

Page 101: 4.1    什么是 OOA  为何需要 OOA?

101

0..1

1

Autograph0..1 0..1Document

Letter Transaction

Letter Autograph Transaction0..1 0..1 1 0..1

图 4-66 共享类的组合

图 4-67 组合关系的泛化

会议记录签名

可以用聚合解决 可以用继承与组合解决

共享类的组合的解决方案

Page 102: 4.1    什么是 OOA  为何需要 OOA?

102

组合 / 聚合 与继承经 常是连用的 , 但不要 混淆

Figure{abstract}

# 位置: pos

Draw( )

组合图

Draw()

多边形

Draw()

描绘 *

Java 实现轮廓:abstract public class Figure{ abstract public void Draw(); protected pos position;}public class Group extends Figure{ public void Draw(); { for(int i=0;i<consist_of. Size();i++) { consist_of[i].Draw(); } } private FigureVector figures; }Public class polygon extends Figure{ public void Draw() { /*画多边形的代码 */ } }图 4-68 图形类图

Page 103: 4.1    什么是 OOA  为何需要 OOA?

Address+setLine(n,line)

《 interface 》 Cloneable

StringitsLine

*

复制 Address时 , 希望复制品独立于原件 , 能自行改变。 Address和 String间的组合关系说明了复制必须是深层次的。

图 4-69 组合隐含的深拷贝

用组合描述深拷贝问题

Page 104: 4.1    什么是 OOA  为何需要 OOA?

import java. util. Vector;public class Address implements Cloneable { private Vector itsLines = new Vector(); public void setLine(int n, string line) { if (n >= itsLines.size()) itsLines.setSize( n+1 ); itsLines.setElementAt (line, n); }

public object clone() throws CloneNot SupportedException { Address clone = (Address)super.clone(); clone.itsLines = (Vector)itsLines.clone(); return clone; }}

为什么仅复制 itsLines向量就够了 ?为什么不必复制 String实例 ?

Page 105: 4.1    什么是 OOA  为何需要 OOA?

105

5) 说明在类的层次结构中,公共部分放在高层“纯粹继承” (pure inheritance)-使你轻松父类可以是抽象的 (abstract),也可以是具体的 (concrete)

泛化 (generalization) 和继承 (inheritance)

泛化是元素之间分类关系。解释一个元素是什么。继承是组合共享递增声明,是一个具体元素遵从广 泛元素定义结构和行为机制。是元素完全描述。两者不同,但关系密切,在泛化关系上,应用继承机制实现描述分解,共享以及多态行为。

Page 106: 4.1    什么是 OOA  为何需要 OOA?

106

建立类图的步骤 :(1) 研究分析问题领域,确定系统的需求。

小 结

(2) 发现对象与类,明确它们的含义和责 任,确定属性和操作。(3) 发现类之间的关系。把类之间的关系 用关联、聚合、组合、依赖等关系及 继承结构表达出来。(4) 调整和细化已得到的类和类之间的关系, 解决诸如命名冲突、功能重复等问题。(5) 绘制类图并编制相应的说明。

Page 107: 4.1    什么是 OOA  为何需要 OOA?

107

泛化关系和聚合关系、组合关系反应了客观世界事物的 分类与组成关系。泛化是一个较广泛和一个较特殊元素之间的类元关系

继承是两个类元之间的“ is a” ,“ is like” ,“ is kind of”

的关系。泛化关系的存在,使得继承机制得以实现,实现描述的 分解和共享以及多态行为。聚合与组合都是描述整体与部分间的关系,是一种关联。聚合表示“ is part of” 关联,整体与部分是离散的。组合是更强类型的聚合,部分对象嵌入在整体对象中。

泛化、聚合、组合关系实现了软件重用和类的共享问题。

注意类的内聚最大化和耦合的最小化问题。

几个关系 :

Page 108: 4.1    什么是 OOA  为何需要 OOA?

108

耦合的来源

图 4-70 类图中的耦合源

person1

依赖耦合

student

Address 《 UI 》AddressEditor

《 Interface 》Searchable

1Lives at

实现耦合

间接继承耦合

直接继承耦合

program

0..*

关联耦合Course

1..*

Seminar

0..*

recommended

0..* 协作耦合

1 0..*Offering of

关联耦合

Page 109: 4.1    什么是 OOA  为何需要 OOA?

109

类图的应用 类图用于对系统静态视图建模。与数据模型 不同,它不仅显示了信息的结构,同时还描 述了系统的行为。 类图中可以包含接口,包,关系等建模元素, 也可以包含对象,链等实例。 类图典型的应用如下: 对系统的词汇建模 对简单协作建模 对逻辑数据库模式建模

Page 110: 4.1    什么是 OOA  为何需要 OOA?

110

类图与对象图 ( 实例图 ) 区别

Employee Company* worksFor类图

WayneEmployee

Ali: Employee

Pot:Employee

OOCorpCompany OOCorp’sBoord:

实例图

图 4-71 类图与对象图区别

Page 111: 4.1    什么是 OOA  为何需要 OOA?

111

类图与对象图 ( 实例图 ) 区别 类图 : 描述给定系统中存在的类 , 但很抽象 .

难将运行时对象之间关系可视化 .

实例图 : 给出了存在于程序执行过程中某个 特殊点的对象与链接的配置示例 . 对象之间链接简单的表示为一条线 . 每个对象包含指向链接另一个对象 的指针 .实例图是由类图生成的 . 表明实例图包含类 图中类和关联所派生的实例和链接 . 一个类图可生成无数个实例图 .

Page 112: 4.1    什么是 OOA  为何需要 OOA?

112

关联的说明 类图中的关联表示两个类之间可能存在的所 有链接,在关联上加上多重性表示。

类图中的泛化关系描述了类之间的结构关系。

继承的层次在实例图中显示的是具体类的单 个的实例,并看做是该超类的实例。

实例图中的关联描述了运行时实例之间的 关系,不能在链接上加上多重性。

实例图中不能包含泛化,仅包含由关联生成 的链接,而不是关联本身。

Page 113: 4.1    什么是 OOA  为何需要 OOA?

练习 1: 两位同学给学校图书馆作了不同模型 : 都是模拟借书者 (Borrower)关系。评价两个模型 , 并改进。

Borrower Book1 *

Person Library

*

1

Borrower

Book1

*

Person Library*

1

Loan

*1

图书馆的两个设计 《 a 》 , 书 (Book)不是存放借书事项资料( 到期、罚款等 ) 的好地方

《 b 》 , 把借出 (Loan)作为图书馆和借书者间的二元关联。“借”与“书”分开 , 并含有借书事项资料。比《 a》有所改进。

《 a 》 《 b 》

但 《 b 》的二元关联 , 每一对 ( 图书馆 , 借书者 ) 必须唯一地确定一个借出 (Loan)对象。但借出对象并不唯一由上述对象确定

Page 114: 4.1    什么是 OOA  为何需要 OOA?

改进模型 :

Borrower

Book1

*

Person Library1

1

Loan

*1

关注借出 (Loan),由三个对象唯一确定 , 用三元关联类作为核心设计。

Borrower Book

1

Person Library

*

1

Loan

*1

manages

用三元关联中有多重性 1,可以简化成二元关联

上述模型没有考虑存在图书馆中尚未借出的书 , 若把这些书包括在内 , 如何改动 ?

改变一下多重性就可以了。

Page 115: 4.1    什么是 OOA  为何需要 OOA?

练习 2: 电脑系统的局部类 添加关联及关联的基数

Permission许可

User

File

ComputerSystem

*

1

FolderItem文件夹项

FileSystem

Folder

1..*

1

1..*

*

1 *Owner主人

0..*

1

0..1

**

0..1

*

多个用户共用一些文件夹单项对象 , 且各有自己的许可设置。文件夹单项由文件夹来管理。

Page 116: 4.1    什么是 OOA  为何需要 OOA?

练习 3:确定一组几何 (Geometry)对象类的关系

Polygon

GeometryItem Point

1 1..*

Ellipse Line

Square Circle

﹛有序﹜

Page 117: 4.1    什么是 OOA  为何需要 OOA?

思考 在上图中有哪些运算是所有几何单项对象可供用的 ? 又有哪些运算真正具有多形性 ? 这些多形性运算在不同类中有哪些不同的实施方法 ?

为所有几何单项对象可供用的运算 : # 绘图 draw(),在屏幕上画出一个几何图形 # 移动 move(dx:Real,dy:Real) # 旋转 rotate(angle:Double,point:Point), 以输入点为中心 , 转过角度

# 反射 reflect_x(),reflect_y(),以 X 轴或 y 轴作为反射 ( 对称 )

# 伸缩运算 scale(scaleFactor:Double,point:Point)

Page 118: 4.1    什么是 OOA  为何需要 OOA?

又哪些运算真正具有多形性 ?

这些多形性运算在不同类中有哪些不同的实施方法 ?

只有绘图类具有多形性

绘图运算在不同类的实施 :

# 对于多边形和方形 , 把相邻的点用直线连接起来 , 最后连接末尾的点 # 对于线 , 简单把两个点用直线连接

# 对于椭园和园 , 把四个点作为包含椭园和园的矩形 顶点 , 由此画出椭园和园