- 面向对象分析与设计 教程
- 面向对象分析与设计 - 首页
- 面向对象分析与设计 - 面向对象范式
- 面向对象分析与设计 - 面向对象模型
- 面向对象分析与设计 - 面向对象系统
- 面向对象分析与设计 - 面向对象原则
- 面向对象分析与设计 - 面向对象分析
- 面向对象分析与设计 - 动态建模
- 面向对象分析与设计 - 功能建模
- 面向对象分析与设计 - UML分析模型
- 面向对象分析与设计 - UML基本符号
- 面向对象分析与设计 - UML结构图
- 面向对象分析与设计 - UML行为图
- 面向对象分析与设计 - 面向对象设计
- 面向对象分析与设计 - 实现策略
- 面向对象分析与设计 - 测试与质量保证
- 面向对象分析与设计 有用资源
- 面向对象分析与设计 - 快速指南
- 面向对象分析与设计 - 有用资源
面向对象分析与设计 - 对象模型
对象模型将软件应用程序中的元素可视化为对象。本章我们将探讨面向对象系统的一些基本概念和术语。
对象和类
对象和类的概念彼此紧密相连,构成了面向对象范式的基础。
对象
对象是在面向对象环境中一个现实世界的元素,它可能具有物理或概念上的存在。每个对象具有:
标识,用于区分系统中的其他对象。
状态,决定对象的特性以及对象持有的属性值。
行为,表示对象根据其状态变化执行的外部可见活动。
可以根据应用程序的需要对对象进行建模。对象可能具有物理存在,例如客户、汽车等;也可能具有无形的概念存在,例如项目、流程等。
类
类表示具有相同特性并表现出共同行为的对象集合。它提供了可以从中创建对象的蓝图或描述。创建作为类成员的对象称为实例化。因此,对象是类的实例。
类的组成部分包括:
一组属性,用于将要从类实例化的对象。通常,类的不同对象在属性值上存在一些差异。属性通常称为类数据。
一组操作,描绘类对象的 behaviour。操作也称为函数或方法。
示例
让我们考虑一个简单的类Circle,它表示二维空间中的几何图形圆。该类的属性可以识别如下:
- x-coord,表示中心的x坐标
- y-coord,表示中心的y坐标
- a,表示圆的半径
其一些操作可以定义如下:
- findArea(),计算面积的方法
- findCircumference(),计算周长的方法
- scale(),增加或减小半径的方法
在实例化期间,至少为某些属性赋值。如果我们创建一个对象my_circle,我们可以为其赋值 x-coord: 2, y-coord: 3, 和 a: 4 来描述其状态。现在,如果对my_circle执行scale()操作,缩放因子为2,则变量a的值将变为8。此操作会改变my_circle的状态,即对象表现出某种行为。
封装和数据隐藏
封装
封装是将属性和方法都绑定到类中的过程。通过封装,可以隐藏类的内部细节。它允许仅通过类提供的接口从外部访问类的元素。
数据隐藏
通常,类的设计使得其数据(属性)只能被其类方法访问,并与外部直接访问隔离。这个隔离对象数据的过程称为数据隐藏或信息隐藏。
示例
在Circle类中,可以通过使属性对类外部不可见并向类添加另外两种访问类数据的方法来实现数据隐藏,即:
- setValues(),为x-coord、y-coord和a赋值的方法
- getValues(),检索x-coord、y-coord和a的值的方法
这里,对象my_circle的私有数据不能被Circle类中未封装的任何方法直接访问。而应该通过setValues()和getValues()方法访问。
消息传递
任何应用程序都需要许多对象以和谐的方式交互。系统中的对象可以使用消息传递相互通信。假设一个系统有两个对象:obj1和obj2。如果obj1希望obj2执行其方法之一,则obj1会向obj2发送消息。
消息传递的特点包括:
- 两个对象之间的消息传递通常是单向的。
- 消息传递使对象之间所有交互成为可能。
- 消息传递本质上涉及调用类方法。
- 不同进程中的对象可以参与消息传递。
继承
继承是一种机制,它允许通过扩展和改进其功能来从现有类创建新类。现有类称为基类/父类/超类,新类称为派生类/子类/子类。子类可以继承或派生超类(超类)的属性和方法,前提是超类允许这样做。此外,子类可以添加自己的属性和方法,并可以修改任何超类方法。继承定义了“is-a”关系。
示例
从哺乳动物类,可以派生许多类,例如人类、猫、狗、牛等。人类、猫、狗和牛都具有哺乳动物的独特特征。此外,每种动物都有其自身的特殊特征。可以说,牛“is-a”哺乳动物。
继承的类型
单继承 - 子类派生自单个超类。
多继承 - 子类派生自多个超类。
多层继承 - 子类派生自一个超类,而该超类又派生自另一个类,依此类推。
层次继承 - 一个类有多个子类,每个子类可能又有后续子类,持续多个级别,从而形成树状结构。
混合继承 - 多继承和多层继承的组合,形成网状结构。
下图描述了不同类型继承的示例。(此处应插入图例)
多态性
多态性最初是一个希腊词,意思是能够采用多种形式。在面向对象范式中,多态性意味着根据操作所作用的实例以不同的方式使用操作。多态性允许具有不同内部结构的对象具有共同的外部接口。多态性在实现继承时特别有效。
示例
让我们考虑两个类,Circle和Square,每个类都有一个方法findArea()。尽管类中的方法名称和目的相同,但内部实现,即计算面积的过程,对于每个类都是不同的。当Circle类的对象调用其findArea()方法时,该操作会找到圆的面积,而不会与Square类的findArea()方法发生冲突。
泛化和特化
泛化和特化表示类之间层次关系,其中子类继承自超类。
泛化
在泛化过程中,类的共同特性被组合起来形成更高层次层次结构中的类,即子类组合起来形成泛化的超类。它表示“is-a-kind-of”关系。例如,“汽车是一种陆地车辆”,或“船是一种水上车辆”。
特化
特化是泛化的逆过程。在这里,对象的组的区分特征用于从现有类形成专用类。可以说,子类是超类的专用版本。
下图显示了泛化和特化的示例。(此处应插入图例)
链接和关联
链接
链接表示一个连接,通过该连接对象与其他对象协作。Rumbaugh将其定义为“对象之间的物理或概念连接”。通过链接,一个对象可以调用方法或遍历另一个对象。链接描述了两个或多个对象之间的关系。
关联
关联是一组具有共同结构和共同行为的链接。关联描述了一个或多个类的对象之间的关系。链接可以定义为关联的实例。
关联的度
关联的度表示连接中涉及的类的数量。度可以是一元、二元或三元。
一元关系连接同一类的对象。
二元关系连接两个类的对象。
三元关系连接三个或更多类的对象。
关联的基数比率
二元关联的基数表示参与关联的实例数。基数比率有三种类型,即:
一对一 - A类的一个对象与B类的一个对象相关联。
一对多 - A类的一个对象与B类的多个对象相关联。
多对多 - A类的一个对象可能与B类的多个对象相关联,反之亦然。
聚合或组合
聚合或组合是类之间的一种关系,通过这种关系,一个类可以由其他类的对象的任意组合构成。它允许对象直接放置在其他类的主体中。聚合被称为“部分-整体”或“具有-一个”关系,能够从整体导航到其各个部分。聚合对象是由一个或多个其他对象组成的对象。
示例
在这种关系中,“一辆汽车具有一个发动机”,汽车是整体对象或聚合体,而发动机是汽车的“一部分”。聚合可以表示:
物理包含 − 例如,一台电脑由显示器、CPU、鼠标、键盘等组成。
概念包含 − 例如,股东具有股份。
对象模型的优势
既然我们已经了解了面向对象的核心概念,那么值得注意的是这种模型所提供的优势。
使用对象模型的优势在于:
它有助于加快软件开发速度。
易于维护。如果某个模块出现错误,程序员可以修复该特定模块,而软件的其他部分仍然可以正常运行。
它支持相对轻松的升级。
它能够重用对象、设计和功能。
它降低了开发风险,尤其是在复杂系统集成方面。