系统设计之面向对象方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常说的实例(instance)也会使用对象(object )一词来替换,两者为同义词。系统运行期间, 会依据类的定义创建对象,如图8-1-21所示。
图8-1-21
类与对象
8.1.3
对象图
对象和类共用矩形图示,不过对象名称下方有底 线,类名称下方没有底线,如图8-1-22所示。对 象名称经常被省略,所以常见带有冒号的类名称 ,这其实是个缺名的对象。
图8-1-5
包等级的属性
8.1.2
3.关联
类图
关联(association)是对象之间最常见的关系, 用来连接有结构关系的对象。请看图8-1-6的例 子,关联的图示为实线,实线两端可以连接两个 不同的类,如图中的个人(person)类和公司( company)类。 不过,关联的两端也可以连接相同的类,如图81-6中的个人类。虽然,关联两端连接相同的类 ,但它的链接(link)其实是连接两个不同的实 例(instance),只不过这两个实例诞生自相同 的类。
图8-1-12
组合关系
8.1.2
6.泛化
类图
实际上,常用继承(inheritance)一词,但是 UML没有使用继承这个词汇,不过UML提供了泛化 (generalization),来达到子类(subclass) 继承超类(superclass)的目的。 泛化将类分为较为泛化的类和较为特化的类,如 图8-1-13所示。通过泛化,子类可以继承超类预 先定义好的声明。泛化的图示为带有大三角形箭 头的实线,由特化的子类连接指向泛化的超类。
8.1.2
1.类
类图
一群对象(object)享有相同的结构、行为、约 束和语义时,称它们是同类(class)的对象。 换句话说,定义一个类就相当于描述了一群对象 。在类中, 使用属性(attribute) 表达对象 的结构, 使用操作(operation)表达对象的行 为。 如图8-1-1所示,定义员工(worker)类之后,便 可以依据此类的描述产生一群对象。这些 :Worker对象不仅可以共用类所定义的属性,拥 有自己的属性值,还可以共用类所定义的操作, 或者共用约束。
8.1.2
类图
图8-1-4
保护等级的属性
8.1.2
类图
最后来谈包可见性。顾名思义,它是为了包而设置的,它的 符号是否定号,如图8-1-5所示。同包的类可以看见其他 类内部的包属性及操作。所以,从图中可以得知,账户可 以看见顾客类的姓名和地址,但是分行(branch)却无法 看见,因为分行不是S包的成员。
图8-1-22
Worker是缺名的对象
8.1.3
对象图
两个对象之间的关系线称为链接(link),如图 8-1-23所示。
图8-1-23
链接
8.1.4
包图
包图(package diagram )也是一种结构图,如 图8-1-24所示。包图主要用来为相关的元素分组 。对于拥有大量繁杂元素的项目而言,适合用包 图来维护管理元素。
8.1
8.1.1 8.1.2 8.1.3 8.1.4
面向对象系统设计
面向对象设计方法概述 类图 对象图 包图
8.1.1
面向对象设计方法概述
1.面向对象程序
程序由一系列协同完成某一任务的一组程序对象 组成。每个程序对象有程序逻辑和一些必要的属 性,这些逻辑和属性封装在一个单元中。对象之 间通过互相传递消息来协调工作,他们共同工作 来完成所需要执行的功能。
8.1.2
类图
图8-1-1
类与对象
类采用三格的矩形图示,顶格放置类名称,中格 放置属性名称,底格放置操作名称。
8.1.2
类图
不过,也可以将类的属性格或操作格隐藏起来,节省 空间,如图8-1-2所示。
图8-1-2
类图示
8.1.2
类图
2.可见性
对象具有封装(encapsulation)属性,可以把数 据结构和行为细节封装起来,外界无法随意存取 。对应UML的类概念,我们会看到类中有属性和 操作,同时可以设定这些成员是否能被外界存取 的可见性(visibility)。以图8-1-3为例,单 笔申购(purchase)封装了一个外界无法存取的 私有属性-金额(amount),以及一个外界可以 调用的公开操作-计算(calculate)。
8.1.2
类图
图8-1-3
私有属性与公开操作
8.1.2
类图
目前,UML预设了四种可见性,分别为公开( public)、私有(private)、保护(protected )和包(package)。公开和私有可见性最常见 ,也最容易懂,如图8-1-3所示,减号(-)为私 有可见性,加号(+)为公开可见性。 私有可见性滴水不漏,就连子类也无法看见超类的 私有成员,这样,其实不利于继承机制。所以, UML设置保护等级的可见性,特别开放子类可以 看见超类的保护等级的属性及操作,以便提供更 方便的继承机制。保护可见性的符号是#号(#) ,如图8-1-4所示。
8.1.2
类图
图8-1-9
多重性
8.1.2
类图
5.聚合与组合
关联的两端是平等的,没有孰轻孰重的分别。若 想表达整体-部分(whole-part)关系,可以改 用聚合关系(aggregation)或组合关系( composition)。 聚合与组合都具有整体-部分的特性,唯一的差别 在于可否分享(share)。聚合关系中的部件( part object)可以与其他整体(whole object )分享,但是组合关系中的部件则由整体独自拥 有。先来看聚合关系,聚合端为空心小菱形,如 图8-1-10所示。
图8-1-15
接口
8.1.2
类图
实际上,可能会先设计出接口与实现者,这种接口特别称 为供给接口(provided interface),指由实现类所供 给的接口,也可以改用接口独特的圆形图示,如图8-116所示。
图8-1-16
供给接口
8.1.2
类图
也可以先设计出使用者以及所需要的接口,这时称这类的 接口为需求接口(required interface),其图示为半 圆形,如图8-1-17所示,以便能够一眼区分出该接口为 供给接口或需求接口。
图8-1-17
需求接口
8.1.2
类图
如果把实现者、使用者、需求接口和供给接口全都凑在一 起,可以使用图8-1-18的简图,以节省图面空间。
图8-1-18
简图
8.1.2
9.注释
类图
注释(comment)可以附加在任何元素上,其内放 置说明文字,就像3M的便利贴(Post-it)一样 。注释可以用在任何图中,不局限于类图。注释 的图示是右上角有折角的矩形,通过虚线连接被 注释的元素,如图8-1-19所示。
包图
2.元素导入
元素导入(element import)可以将包内的任一元 素导入到另一个包中。如图8-1-26所示,元素导入 采用带箭头的虚线表示,旁边标上<<import>>关键 字,意味着Program包导入了Time数据类型。
图8-1-26
元素导入
Βιβλιοθήκη Baidu
8.1.4
3.包导入
包图
如果一次导入整个包里的所有元素,可以使用包导 入(package import)。如图8-1-27所示,Order System与Domain DataType之间有包导入的关系, 所以Order System内的Employee和Order可以直接 使用Domain DataType里的Address和Date。
类图
有时候会看到带箭头实线,那是在标示导航性( navigation),意味着可以由来源端(source end) 导航到箭头所在处的目标端(target end)。如图81-8所示,:Member对象可以链接到:Password对象,但 是反向则不成立,也就是说,无法从:Password对象链 接到:Member对象,因为两者之间是单向的关联。
8.1.2
类图
图8-1-10
聚合关系
8.1.2
类图
因为船(boat)和引擎(engine)之间采用聚合 关系,意味着船为整体,而引擎为它的部件。而 且,倘若a船被删除了,或者a船不再需要这个引 擎而删除之间的链接,b船可以接手使用这个引 擎部件,如图8-1-11所示。
图8-1-11
部件可重用
8.1.2
8.1.2
类图
图8-1-6
关联
8.1.2
类图
关联不一定是二元关联(binary association) ,也可以是多元关联(n-ary association)。 多元关联的图示是连接大菱形的实线,如图8-17所示为三元关联(ternary association)。
图8-1-7
三元关联
8.1.2
8.1.2
类图
例如,结账时需要用到信用卡,所以结账(check out)类依赖信用卡(credit card)类,如图8-114所示。依赖的图示是带箭头虚线,由依赖元素指 向供应者元素。
图8-1-14
依赖
8.1.2
8.接口
类图
接口(interface)如同契约,负责的类必须负责实现 它的公开操作,以及负责维护它的公开属性。以图 8-1-15为例,ProximitySensor类负责实现ISensor 接口内部的active操作与read操作,而TheftAlarm 类则可以使用ISensor接口。
8.1.2
类图
图8-1-13
泛化
8.1.2
7.依赖
类图
某一模型元素需要另一个模型元素所提供的规格 (specification)或实现(implementation) 时,两者之间的关系称为依赖(dependency)。 也就是说,少了供应者元素(supplier element )的话,依赖元素(depending element)在语 义上(semantically)或者结构上( structurally)可能会不完整(imcomplete)。 因此,一旦供应者元素变动,很可能会影响到依 赖元素。
8.1.1
面向对象设计方法概述
2.面向对象程序设计的原则
(1)封装:即对象实例化所需的数据与对象包含 在一起,对象的逻辑和类包含在一起,它们组成 了对象的模板。封装简化了调试,因为数据的任 何变化都是由类中的代码所引起的。 (2)信息隐藏:它与封装是相关联的,它使一个 系统中某一对象的数据域不为其他对象所见。一 般来说,在面向对象程序设计中,属性虽不为外 界所见,但它的方法是可见的,即能通过一个外 部消息来调用这些方法。
图8-1-24
包图
8.1.4
1.包
包图
包(package)就像一般的纸箱,可以将相关、欲 放置在一起的东西打包成箱。包的图示是上小下 大的两个重叠矩形,可以将元素放置其内,如图 8-1-25a所示。也可以将包的内容隐藏起来,形 成如图8-1-25b所示,以节省图面空间。
图8-1-25
包
8.1.4
类图
但是,如果图8-1-11改成组合关系,b船就无法重用引擎部 件了。因为组合关系中的整体不会分享部件,所以一旦a 船被删除,或者a船不再需要这个引擎时,a船都会负责将 引擎销毁掉。请看图8-1-12的例子,组合端为实心小菱形 ,意味着视窗(window)被删除时,构成视窗的部件都会 连带被删除,这是常见的组合关系。
本章要点
面向对象程序的基本概念
类图 对象图 包图
8.1
面向对象系统设计
系统分析和设计方法是紧密联系的,如 果分析阶段用的是面向对象模型,那么设计 阶段也应该用面向对象模型完成。面向对象 设计模型在面向对象分析模型和面向对象程 序之间架起了一座桥梁。下面将首先了解面 向对象程序是如何工作的,然后将讨论如何 设计模型以及为了支持面向对象程序设计应 该怎样构建模型。
图8-1-19
注释的图示
8.1.2
类图
10.图书管理系统的类图 参见书P178图8-5.
8.1.3
对象图
对象图(object diagram)也是一种结构图,如 图8-1-20所示,用来呈现系统在特定时刻的对象 (object),以及对象之间的链接(link)。
图8-1-20
对象图
8.1.3
对象图
图8-1-8
导航性
8.1.2
类图
4.多重性
多重性元素(multiplicity element)主要包含 一组上下限数,用来指出可被允许生成的实例( instance)数量,即最多可以生成多少数目(上 限),最少不得低于多少数目(下限)。关联的 两端以"下限..上限"的格式标示出多重性,如图 8-1-9中的1..*。星号(*)代表无指定上限,下 限最低为0。如果上下限数相同,标示出一个数 目就可以了。因此,可以解读为: 一个顾客(customer)可以拥有一个到多个的账 户(account),但是一个账户只能由一个顾客 所拥有。