1、面向对象基本概念
- 面向对象分析是为了获得对应用问题的理解,其主要任务是抽取和整理用户需求并建立问题域精确模型。
- 面向对象设计是采用协作的对象、对象的属性和方法说明软件解决方案的一种方式,强调的是定义软件对象和这些软件对象如何协作来满足需求,延续了面向对象分析。
- 面向对象实现主要强调釆用面向对象程序设计语言实现系统。
- 面向对象测试是根据规范说明来验证系统设计的正确性。
1.1 面向对象分析
- 面向对象的分析: 认定对象、组织对象、描述对象之间的相互关系、定义对象操作、定义对象的内部消息
- 分析过程中: 采用名词短语识别对象,动词短语识别对象操作。
- 对象是基本的运行实体,它既包括数据(属性),也包括作用于数据的操作(行为)。
- 对象的状态: 用来标识对象的所有属性以及每个属性的当前值。
- 行为: 对象根据它的状态以及消息传递所采取的行动和所作的反应
- 操作: 一个类提供个给它的对象的一种服务
1.2 面向对象设计
OOD在复用OOA 模型的基础上,包含与OOA对应如下五个活动。
(1)识别类及对象。
(2)定义属性。
(3)定义服务。
(4)识别关系。
(5)识别包。
1.3 面向对象测试
1.4 面向对象基本概念
面向对象=对象(Object)+分类(Classification)+继承(Inheritance)+通过消息的通信(Communication with Messages)
-
封装: 一种信息的隐蔽技术,使对象的使用者与对象的生产者分离,通过组件提供功能和接口,开发者无需了解所使用的软件组件内部的工作机制,只需要知道如何使用组件接口即可。
-
继承: 在定义和实现一个类时,可以在一个已存在的类的基础上进行。一种模仿现实世界中继承关系的一种类之间的关系,是父类(超类)和子类之间共享数据的方法和机制。一个父类可以有多个子类,子类可以继承父类或祖先类的属性或操作作为自己的内容而不用重新定义,也可以覆盖这些操作,并加入新的内容。
-
覆盖: 子类通过更具体的方式实现从父类继承来的方法
-
多重继承: 一个类可以继承另一个类,而另一个类可以继承别的类。多重继承可能造成混淆的情况,出现二义性的成员。
-
多态: 多种状态,即接口的不同实现方式,例如游戏中不同角色发动攻击时会有不同的效果。多态的实现受到继承的支持,利用类的继承的层次关系,把具有通用功能的消息存放在高层次,而不同的实现这一功能的行为放在较低层次。一个对象发送通用消息服务时,要根据接收对象的具体情况将求的操作与实现的方式进行连接,即动态绑定,以实现这些低层次上发生的对传给用消息以不同响应。
-
⭐⭐⭐
-
参数多态(静态多态): 采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型
-
包含多态(属于动态多态): 在许多语言中都存在,最常见的例子就是子类型泛化,即一个类型是另一个类型的子类型。
-
过载多态(属于静态多态): 同一个名字在不同的上下文中所表示的含义不同。比如:运算符重载、函数重载
-
强制多态(属于静态多态): 编译程序通过语义操作,把操作对象的类型强行加依变换,以符合函数或操作符的要求。
-
-
接口: 一种特殊的抽象机制,其中操作不需要自己实现,而是需要由实现类进行实现。对于实现类为抽象类的仍然可以保持操作为抽象,如果实现类是一个具体类,其中的操作必须实现。
-
消息: 不同类的对象通过消息传递互相通信
-
绑定:面向对象系统中,绑定是一个把过程调用和响应调用需要执行的代码加以结合的过程。
- 静态绑定: 在编译时进行的绑定
- 动态绑定: 在运行时进行的绑定。
-
重载: 一个类中,函数或方法拥有同样的名称,单参数列表。
-
依赖:
- 泛化:一个类与它的一个或多个细化类之间的关系
- 组合:一种聚合关系,其中整体负责其部分的创建和销毁,如果整体不存在,那么部分也将不存在。
- 聚合:较大的整体类包含一个或多个较小的部分类
2、设计模式
3、UML
UML:一种面向对象软件的标准化建模语言,由三个要素构成:UML的基本构造快、支配这些构造快如何放置在一起的规则、运用与整个语言的一些公共机制。UML的词汇表包含3种构造块:事物、关系和图。事物是对模型中最具有代表性的成分的抽象;关系把事物结合在一起;图聚集了相关的事物。
3.1 事物
3.2 关系
U中有4种关系:依赖、关联、泛化和实现。
① 依赖(Dependency)
依赖是两个事物间的语义关系,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。在图形上,把一个依赖画成一条可能有方向的虚线,如下图所示。
②⭐⭐ 关联(Association)、聚集、组合。
关联是一种结构关系,它描述了一组链,链是对象之间的连接。在关联上可以标注重复度(Multiplicity)和角色(Role)。
举例:
意思:1个雇主可以有0个或多个员工,一个员工可以有0个或一个雇主
聚集(聚合)(Aggregation)是一种特殊类型的关联,它描述了整体和部分间的结构关系。部分和整体生命周期不一致,整体消失了部分仍可以存在,也就是说部分可以脱离整体存在。
举例:
组合:部分和整体生命周期一致,部分不能脱离整体,即整体消失后部分也会消失
③ 泛化(Generalization)
泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种方法,子元素共享了父元素的结构和行为。在图形上,把一个泛化关系画成一条带有空心箭头的实线,它指向父元素,如图7-9所示。
④ 实现(Realization)
实现是类元之间的语义关系,其中一个类元指定了由另一个类元保证执行的契约。在两种情况下会使用实现关系:一种是在接口和实现它们的类或构件之间;另一种是在用例和实现它们的协作之间。在图形上,把一个实现关系画成一条带有空心箭头的虚线,如图7-10所示。
3.3 图
图(Diagram)是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。为了对系统进行可视化,可以从不同的角度画图,这样图是对系统的投影。
UML 2.0 提供了13种图,分别是类图、对象图、用例图、序列图、通信图、状态图、活动图、构件图、组合结构图、部署图、包图、交互概览图和计时图。序列图、通信图、交互概览图和计时图均被称为交互图。
1)类图
类图(Class Diagram)展现了一组对象、接口、协作和它们之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。类图给出系统的静态设计视图。包含主动类的类图给出了系统的静态进程视图。
类图中通常包括:类、接口、协作、依赖、泛化和关联关系。
权限修饰符:+
public:公有的、-
private:私有的、#
protected:受保护的、~
package 包
2)对象图
对象图(Object Diagram) 展现了某一时刻一组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照。对象图一般包括对象和链,如图7-12所示。
3)用例图
用例图(Use Case Diagram)展现了一组用例、参与者(Actor)以及它们之间的关系。用例图通常包括:用例、参与者、 用例之间的扩展关系(<extend>
) 和包含关系(<<include>>
),参与者和用例之间的关联关系,用例与用例以及参与者与参与者之间的泛化关系。
- 泛化(generalization):泛化关系是一种继承关系,子用例将继承基用例的所有行为,关系和通信关系,也就是说在任何使用基用例的地方都可以用子用例来代替。泛化关系在用例图中使用空心的箭头表示,箭头方向从子用例指向基用例。
- 扩展(extend): extend关系是对基用例的扩展,基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能。
- 包含(include): include为包含关系,当两个或多个用例中共用一组相同的动作,这时可以将这组相同的动作抽出来作为一个独立的子用例,供多个基用例所共享
包含关系:一个用例包含另一个用例
扩展关系:一个用例执行的时候,可能会发生一些特殊情况或可选情况
泛化关系:子类泛化父类
4)交互图
交互图用于对系统的动态方面进行建模。一张交互图表现的是一个交互,由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。交互图表现为序列图、通信图、交互概览图和计时图,每种针对不同的目的,能适用于不同的情况。交互图一般包含对象、链和消息。
- 序列图是强调消息时间顺序的交互图;
- 通信图是强调接收和发送消息的对象的结构组织的交互图;
- 概览图强调控制流的交互图。(了解)
序列图
序列图(Sequence Diagram)是场景(Scenario)的图形化表示,描述了以时间顺序组织的对象之间的交互活动。
通信图
通信图(Communication Diagram)强调收发消息的对象的结构组织,在早期的版本中也被称作协作图。通信图强调参加交互的对象的组织。
5)状态图
状态图(State Diagram)展现了一个状态机,它由状态、转换、事件和活动
组成。状态图关注系统的动态视图,对于接口、类和协作的行为建模尤为重要,强调对象行为的事件顺序。
6)活动图
活动图(Activity Diagram)是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程,如图7-19所示。活动图专注于系统的动态视图,它对于系统的功能建模特别重要,并强调对象间的控制流程。活动图一般包括活动状态和动作状态、转换和对象。
7)构件图
构件图(Component Diagram)展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图,如图7-20所示。它与类图相关,通常把构件映射为一个或多个类、接口或协作。
意思:Order System 需要 Inventory System 接口,并实现ProductAccessor
评论区