type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 软考专项:上午题 #7 面向对象
一、面向过程与面向对象
区别
对于问题把大象装进冰箱,需要几步?
- 面向过程
- 关心的是我该怎么做
- 我打开冰箱
- 我把大象装进冰箱
- 我关上冰箱
- 面向对象
- 关心的是我该让谁去做,调用对象的操作来实现这个功能
- 对象:大象
- 大象打开冰箱
- 大象钻进冰箱
- 大象关上冰箱
方法重载
- 方法名相同 参数个数不同
- 或者 参数类型不同
- 或者 参数类型顺序不同
方法重写/覆盖
- 方法名相同 参数个数相同
- 参数类型相同
- 方法体不同
多态
- 参数多态:最纯的多态
- 包含多态:子类型化
- 过载多态:上下文同名不同表现
- 强制多态:无过多介绍
动态绑定与静态绑定
- 左编译 右执行
- 绑定在执行时进行,叫动态绑定,因此一个给定的过程调用和代码的结合直到调用发生时才进行。动态绑定是和类的继承以及多态相联系的
- 绑定在编译时进行,叫静态绑定
二、面向对象的设计原则
单一责任原则(Single Responsibility Principle,SRP)
- 就一个类而言,应该仅有一个引起它变化的原因,即当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任。
- 对一个类来说仅有一个使他变化的原因
开放-封闭原则(Open & Close Principle,OCP)
- 软件实体(类,模块,函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。
- 扩展开放,修改关闭
里氏替换原则(Liskov Substitution Principle,LSP)
- 子类型必须能够替换掉他们的基类型。即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。当一个子类的实例应该能够替换任何其超类的实例时,他们之间才具有是一个(is - a )的关系。
- (基)父类可以出现的地方,子类一定可以出现
依赖倒置原则(Dependence Inversion Principle,DIP)
- 抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于底层模块,二者都应该依赖于抽象
- 依赖于抽象而不依赖于细节(实现)
接口分离原则(Interface Segregation Principle,ISP)
- 不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于它所在的类层次结构,即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。
- 依赖于抽象而不依赖于具体
共同重用原则(Common Reuse Principle,CRP)
- 一个包中所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类
- 一个类被重用,那么整个包中的类都要被重用
共同封闭原则(Common Closure Principle,REP)
- 包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响
- 一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响
面向对象测试
- 算法层
- 测试类中定义的每个方法,基本上相当于传统软件测试的单元测试
- 类层
- 测试封装在同一个类中的所有方法和属性之间的相互作用。在面向对象软件中类是基本模块,因此可以认为这是在面向对象测试中所特有的模块测试
- 模板层
- 测试一组协同工作的类之间的相互作用,大体上相当于软件测试中的集成测试
- 系统层
- 把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。
三、UML
关系
UML中有4种关系:依赖、关联、泛化、实现。
依赖关系
- 依赖是两个事物间的语义关系,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。在图形上,把一个依赖画成一条可能有方向的虚线。

- A是依赖事物,B是独立事物
关联、聚合和组合关系
- 一种结构关系,它描述了一组链,链是对象之间的连接。聚集是一种特殊类型的关联,它描述了整体与部分间的结构关系。在关联上可以标注重复度和角色。
- 聚合和组合
- 聚合:部分和整体的生命周期不一致,整体消失了,部分仍然存在。(部分可以脱离整体存在)
- 如员工与公司,空心实线菱形头
- 组合:部分和整体的生命周期一致,整体消失,部分也消失。
- 如大脑与人类,实心实线菱形头
泛化关系
- 泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种方法,子元素共享了父元素的结构和行为,在图像上泛化是一条带有空心箭头的实线

实现关系
- 实现是类元之间的语义关系,其中一个类元指定了由另一个类元保证执行的契约。在两种情况下会使用实现关系;一种是在接口和实现它们的类或构件之间;另一种是在用例和实现它们的协作之间。在图形上,把一个实现关系画成一条带有空心箭头的虚线。

四、UML类图
图是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。
类图
- 展现了一组对象、接口、协作和它们之间的关系。
- +:public
- :private
- #:protected
- ~:package

五、用例图(类图、对象图、用例图都是对于系统静态)
用例图展现了一组用例、参与者以及它们之间的关系。用例图可用于对系统的语境建模,对系统的需求建模

- 用例
- 参与者
- 用例之间的扩展关系(《extend》)和包含关系(《include》),参与和用例之间的关联关系,用例和用例以及参与者和参与者之间的泛化关系
包含关系(基本用例指向被包含用例)
- 用例和用例之间的关系,一个用例包含另一个用例,当基本用例发生时,被包含用例一定发生。

扩展关系(扩展用例(特殊/可选)指向基本用例)
- 用例和用例之间的关系,一个用例执行的时候,可能会发生一些特殊的情况或可选的情况,这种情况就是这个用例的扩展用例,UML的扩展是extend,Java 的继承是extends

泛化关系(特殊参与者/用例指向基本参与者/用例)
- 子类指向父类,空心实线箭头

六、交互图(对于系统的动态方面建模)
由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。交互图表现为序列图、通信图、交互概览图和计时图
- 交互图一般包含对象、链和消息
序列图(顺序图)
- 序列图是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。

通信图(协作图)
- 通信图强调收发消息的对象的结构组织,在早期的版本中也被称作协作图。通信图强调参加交互的对象的组织。产生一张通信图,首先要将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消息来修饰这些链。

- 通信图有顺序号,为表示一个消息的时间顺序,可以给消息加一个数字前缀(从1号消息开始),在控制流中,每个新消息的顺序号单调增加(如2、3等)。为了显示嵌套,可使用带小数点的号码(1表示第一个消息;1.1表示嵌套在消息1中的第一个消息。)嵌套可为任意深度。还要注意的是,沿同一个链可以显示许多消息(可能发自不同的方向),并且每个消息都有唯一的顺序号。
- 序列图和通信图是同构的,它们之间可以相互转换
状态图
- 状态图展现了一个状态机,它有状态、转换、事件和活动组成。状态图关注系统的动态视图,对于接口、类和协作的行为建模尤为重要,强调对象行为的事件顺序。
- 状态图包括简单状态和组合状态、转换(事件和动作)
- 状态是指对象的生命周期中某个条件或者某个状态,在此期间对象将满足某些条件、执行某些活动或等待某些事件,是对象执行了一系列活动的结果,当某个事件发生后没对象的状态将发送变化。
- 嵌套在另外一个状态中的状态叫子状态,含有子状态的状态称为组合状态。
- 转换是两个状态之间的一种关系,表示对象将在源状态中执行一定的动作,并在某个特定事件发生而且某个特定的警戒(监护)条件满足时进入目标状态。
状态和活动(里面包含事件[监护条件]/动作)
- 活动(动作)可以在状态内执行,也可以在状态转换(迁移)时执行

转换(迁移)和事件

- 转换包括两个状态(源状态和目标状态)它上面有事件,监护条件,动作
- 事件触发转换(迁移)

七、UML图总和
静态建模
- 类图、对象图、用例图
动态建模
- 序列图(顺序图,时序图)、通信图(协作图)、状态图、活动图
物理建模
- 构件图(组件图)、部署图
交互图
- 序列图、通信图、交互关联图
- 作者:poze624
- 链接:https://poze624.top/%E8%BD%AF%E8%80%83%E4%B8%93%E9%A1%B9/20250920151944
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。