[toc]
软件设计师笔记07_面向对象技术_精简考点
科目一考试大概有11分左右,科目二考试有一道大题。


基本概念
- 对象:对象是一个基本实体,包括数据(属性)和操作(方法)。
- 消息和消息通信:对象之间进行通信的一种方式叫做消息。消息是异步通信的。
- 类:类是对象的模板,它定义了对象的属性和方法。
- 继承:继承是父类与子类之间共享数据和方法的机制。这是类之间的一种关系。
- 重置/覆盖:在子类中重新定义父类中已经定义的方法。
- 重载:一个类可以有多个同名而参数类型不同的方法。
- 动态绑定:根据接收对象的具体情况将请求的操作与实现的方法进行连接(运行时绑定)。
- 多态:不同对象收到同样的消息产生不同的结果(软设一般只涉及过载多态。即同一个名字在不同的上下文中所代表的含义不同)。
类的类型
类可以分为三种类型,分别是实体类、边界类和控制类。
- 实体类:代表实体对象
- 控制类:描述一个用例所具有的事件流控制行为,控制一个用例中的事件顺序。通常情况下,控制类没有属性,但一定有方法。
- 边界类: 描述外部参与者与系统之间的交互。常见的边界类有窗口、通信协议、打印机接口、传感器和终端等。
面向对象设计原则 ⭐️
- 单一职责原则:设计目的单一的类。
- 开放封闭原则:对扩展开放,对修改封闭。
- 里氏替换原则:子类可以替换父类。
- 依赖倒置原则:要依赖于抽象,而不是具体实现;要针对接口编程,不要针对实现编程。
- 接口分离原则:不强迫客户依赖于他们不用的方法。
- 共同封闭原则:包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
- 共同重用原则:一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
例题
例题1
采用面向对象设计方法开发电商平台,设计负责处理用户订单的类OrderService,它不仅处理订单创建,还负责记录订单日志和发送确认邮件。OrderService类违反了面向对象设计( )原则。
正确答案:单一职责原则
多态
多态有不同的形式,分为参数多态、包含多态、过载多态和强制多态四种。
- 参数多态 通过给出不同的类型参数,使得一个结构有多种类型;
- 包含多态是指同样的操作可用于一个类型及其子类型,即子类型化:
- 过载多态是指同一个名字在不同上下文中可代表不同的含义;
- 强制多态是指通过语义操作把一个变量的类型加以变换。
UML
UML由3个要素构成
- UML的基本构造块
- 支配这些构造块如何放置在一起的规则和运用
- 整个UML语言的一些公共机制
UML的3种基本构造块
- 事物(对模型中最具有代表性的成分的抽象)
- 关系(把事物结合在一起)
- 图(聚集了相关的事物)
UML中的事物
UML 中有4种事物:结构事物、行为事物、分组事物和注释事物。
结构事物是指 UML 模型的静态部分,是模型中的名词,用来描述概念。如类、接口、用例、构件等。 
行为事物是指 UML 模型的动态部分,是模型中的动词,用来描述行为。如交互、活动等。 
分组事物是指 UML 模型的组织部分。最主要的分组事物是包,包是把元素组织在一起的一种机制。
注释事物是指 UML 模型的解释部分,用来描述,说明模型中的元素。
UML类图中的关系 ⭐️
UML 类图中 中有4种关系:依赖、关联、泛化和实现。
UML 类图中 所有关系(4 大类)
├─ 依赖(虚线,带箭头,指向依赖关系的被依赖者)
├─ 关联(细分 3 种)
│ ├─ 普通关联(普通直线)
│ ├─ 聚合(空心菱形)
│ └─ 组合(实心菱形)
├─ 泛化(继承)(实线空心三角箭头,指向父类)
└─ 实现(接口)(虚线三角空心箭头,指向接口类)UML 类图中各种关系的画法
- 依赖关系是虚线(带箭头,指向依赖关系的被依赖者)。
- 关联关系。
- 普通关联是普通直线。指向双方。
- 聚合(聚集)关联关系是实线空心菱形。指向整体。
- 组合关联关系是实线实心菱形。指向整体。
- 泛化关系是实线空心三角箭头,指向父类。
- 实现关系是虚线空心三角箭头,指向接口类。

普通关联关系上的0..1表示0个或1个。0..*表示0个或多个。
在图形上,把一个泛化关系画成一条带有空心箭头的实线,它指向父元素。
在图形上,把一个实现关系画成一条带有空心箭头的虚线,如图所示
UML类图中的关系总结 ⭐️
关系按耦合强度从弱到强排序: 依赖 < 关联 < 聚合 < 组合 < 泛化 < 实现
- 依赖关系:一个事物发生变化影响另一个事物。若类A的方法中仅仅使用了类B的对象,那么类A依赖于类B。若A依赖于B,则A在箭头起点,B在箭头终点。用实线箭头表示。
- 关联关系:(分为普通关联、聚合关联和组合关联)
- 普通关联:类与类之间,对象与对象之间的一种结构关系。可以表示1:1或者1:n或m:n。用实线表示。
- 聚合关系:整体与部分的生命周期不同。整体消失了,部分任然可以存在。双方是独立的。类似学校和学生。用空心菱形表示。指向整体。
- 组合关系:整体与部分的生命周期相同。整体消失了,部分也会消失。双方不是独立的。类似汽车和零件。用实心菱形表示。指向整体。
- 泛化关系:泛化是一个类与它的一个或多个细化类之间的关系,类似父类和子类。一般/特殊关系。用空心三角箭头表示。指向父类。
- 实现关系(很少考):类似接口与类之间的关系。用虚线空心三角箭头表示。指向接口类。
记忆点:
- 依赖关系:类A依赖于类B,那么类A的方法中使用了类B的对象。一个事物发生变化影响另一个事物。
- 关联关系:(分为普通关联、聚合关联和组合关联)
- 普通关联:类与类之间,对象与对象之间的一种结构关系。表示双方有1:1或者1:n或m:n的关系。
- 聚合关系:整体与部分的生命周期不同,是聚合在一起的。可分离。整体没了,部分还能活。
- 组合关系:整体与部分的生命周期相同,是组合在一起的。不可分离。整体没了,部分也没了。
- 泛化关系:类似父类,子类。特殊/一般关系。
- 实现关系:类似接口和实现类。
例题
[2024年上半年] UML类图在软件建模时,给出软件系统的一种静态设计视图,用( )关系可明确表示两类事物之间存在的特殊/一般关系。
正确答案:泛化关系
UML中的图 ⭐️
- 类图:描述系统中的对象、接口、类之间的关系,是系统的静态设计视图。
- 对象图:描述对象之间的关系。对象图描述了在类图中所建立的对象的静态快照。
- 用例图:描述系统与外部系统及用户的交互。从用户使用系统的角度对系统进行了划分;
- 序列图:描述了对象如何通过消息互相交互,说明了消息如何在对象之间被发送和接收以及发送的顺序。。
- 通信图:不强调时间顺序,只强调事件之间的通信。
- 状态图:用于对一个特定对象的动态行为建模,说明了一个对象的生命周期——对象可以经历的各种状态,以及引起对象从一个状态向另一个状态转换的事件。
- 活动图:是一种特殊的状态图,描述一个业务过程或者一个用例的活动的顺序流。
- 构件图:描述系统的物理结构,它可以用来显示程序代码如何分解成模块。
- 部署图:描述系统中硬件和软件的物理架构,它描述构成系统架构的软件构件、处理器和设备。
- 顺序图:是一种交互图,它由一组对象或参与者以及它们之间可能发送的消息构成。顺序图是强调消息的时间次序的交互图。
记忆点:
- 类图:描述类与类之间的结构关系。
- 用例图:描述用户与系统的交互过程,通常有一个小人表示用户。
- 构件图:描述模块之间怎么拼接在一起的。
- 部署图:描述系统中硬件和软件的物理架构。
- 顺序图:描述对象与对象之间,按照时间的交互顺序,即谁先调用谁。
- 活动图:描述一个业务过程或者一个用例的活动的顺序流。
- 状态图:描述一个对象各种状态变化。
类图
用例图
构件图
部署图
序列图(顺序图)
活动图
状态图 
设计模式 ⭐️
设计模式的要素
设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构。
设计模式的类别
设计模式主要分为三类:创建型模式、结构型模式、行为型模式。
- 创建型模式:与对象的创建有关。
- 结构型模式:主要处理类和对象的组合
- 行为型模式:主要是描述类或者对象的交互行为


各个设计模式的应用场景 ⭐️⭐️⭐️
创建型模式应用场景 (高频)
- 单例模式模式:一个类只造一个对象。为了线程安全。
- 工厂方法模式:一个工厂造一种产品。一对一生产。
- 抽象工厂模式:一个工厂造一整套东西。
- 构建器模式:分步造复杂对象。
- 原型模式:通过原型对象创建新的对象。克隆复制对象
结构型模式应用场景 (高频)
- 适配器模式:若接口不符合需求时,将一个类的接口转换成客户希望的另外一个接口。
- 装饰器模式:动态的给对象添加一些额外的功能。动态加功能
- 代理模式:控制对对象的访问权限(找经纪人、中介帮忙访问)
- 组合模式:处理树形结构(整体与部分,如文件夹与文件)
- 外观模式:为复杂系统提供简化接口(隐藏内部细节,对外暴露单一入口)
- 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
- 享元模式:由于大量对象造成很大开销的时候,可以运用共享技术支持大量相似对象的复用。
行为型模式应用场景 (高频)
- 观察者模式: 处理一对多关系(一个主题变化,多个观察者自动更新。例如发布和订阅功能)
- 策略模式:多个算法或策略需动态切换(如支付方式)
- 责任链模式: 让多个对象依次处理请求(每个对象决定自己处理或传递给下一个)
- 中介者模式:用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合。(不直接调用,通过中介对象来调用)
创建型设计模式的应用场景
结构型设计模式应用场景
行为型设计模式应用场景 

关键词总结:⭐️⭐️⭐️
单例模式:关键字 唯一对象,唯一实例。
工厂模式: 一个工厂造一类产品。
抽象工厂模式:一个工厂造一整套产品。
构建器模式:分步造复杂对象。
原型模式:通过原型对象克隆复制对象,避免重复创建。
适配器模式:接口不兼容要转换。将一个类的接口转换成客户希望的另外一个接口。
装饰器模式:动态加功能。
代理模式:找中介代理来访问对象。
组合模式:处理树形结构(整体与部分,如文件夹与文件)
外观模式:为复杂系统提供简化入口。
桥接模式:将抽象和实现分离。
享元模式:当大量对象造成开销的时候,可以减少开销。
观察者模式:主体变化,其他观察者都变化。类似发布订阅功能。
策略模式:动态切换算法和策略(如支付方式)
责任链模式:多个对象依次传递,直到有一个对象处理了请求。
中介者模式:不直接调用,通过中介对象来调用
访问者模式:不改变类的前提下,为对象所述的类添加新的操作。
例题
例题:在一个气象监测系统中,天气变化会影响多种显示设备(如PC应用和手机应用)。这些设备需要及时更新。这一需求适合采用()设计模式进行设计。
正确答案:观察者模式:主体变化,其他观察者都变化。类似发布订阅功能。
[2022年下半年] 驱动新能源汽车的发动机时,电能和光能汽车分别采用不同驱动方法,而客户装希望使用统一的驱动方法,需定义一个统一的驱动接口屏藏不同的驱动方法,该要求适合采用( )模式。
正确答案:适配器设计模式将一个类的接口转换成客户希望的另外一个接口。
真题
在面向对象设计时,如果重用了包中的一个类,那么就要重用包中的所有类,这属于( 共同重用 )原则。
在领域类模型中不包含( 领域对象 )。
在面向对象方法中,两个及以上的类作为一个类的父类时,称为( 多重继承 ),使用它可能造成子类中存在( 二义性 )的成员。
( 泛化 ) 是一个类与它的一个或多个细化类之间的关系,即一般与特殊的关系。
在面向对象的系统中,对象是运行时实体,其组成部分不包括( 消息 );一个类定义了一组大体相似的对象,这些对象共享( 属性和行为 )。
采用面向对象方法进行系统开发时,以下与新型冠状病毒有关的对象中,存在“一般-特殊’关系的是( 确诊病人和治愈病人 )。
对象的( 状态 )标识了该对象的所有属性(通常是静态的)以及每个属性的当前值(通常是动态的)。
在面向对象方法中,支持多态的是( 动态绑定 )。
( 过载 )多态是指操作(方法)具有相同的名称、且在不同的上下文中所代表的含义不同。
采用面向对象方法进行系统开发时,需要对两者之间关系创建新类的是( 医生和病人 )。
对采用面向对象方法开发的系统进行测试时,通常从不同层次进行测试。测试类中定义的每个方法属于( 算法 )层。
在下列机制中,( 动态绑定 )是指过程调用和响应调用所需执行的代码在运行时加以结合;而( 静态绑定 )是过程调用和响应调用所需执行的代码在编译时加以结合。
采用面向对象方法进行软件开发,在分析阶段,架构师主要关注系统的( 行为 )。
进行面向对象系统设计时,修改某个类的原因有且只有一个,即一个类只做一种类型的功能,这属于( 单一责任 )原则。
在面向对象方法中,多态指的是( 客户类无需知道所调用方法的特定子类的实现 )。
以下关于面向对象继承的叙述中,错误的是( 继承仅仅允许单重继承,即不允许一个子类有多个父类 )。
UML
- 在UML用例图中,参与者表示( 人、硬件或其他系统可以扮演的角色 )。
- UML中关联是一个结构关系,描述了一组链。两个类之间( 可以有多个由不同角色标识的 )关联。
- 在UML图中,( 部署 )图用于展示所交付系统中软件组件和硬件之间的物理关系。
- 对一个复杂用例中的业务处理流程进行进一步建模的最佳工具是UML ( 活动图 ) 。
- UML包图展现由模型本身分解而成的组织单元及其依赖关系,以下关于包图的叙述中,不正确的是( 一个元素可以被多个包拥有 )。
- UML构件图(component diagram)展现了一组构件之间的组织和依赖,专注于系统的静态( 实现 )视图,图中通常包括构件、接口以及各种关系。
设计模式
- 为图形用户界面(GUI)组件定义不同平台的并行类层次绩构,适合采用( 抽象工厂 )模式。
- ( 策略 )模式定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,使得算法可以独立于使用它们的客户而变化。
- 以下关于 单例 模式的描述中,正确的是( 它能够保证一个类只产生唯一的一个实例 ) 。
- ( 观察者 )设计模式能使一个对象的状态发生改变时通知所有依赖它的监听者。
- 在发布-订阅消息模型中,订阅者订阅一个主题后,当该主题有新消息到达时,所有订阅者都会收到通知。( 观察者 )设计模式最适合这一模型。
- ( 命令 )设计模式将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
- 欲使一个后端数据模型能够被多个前端用户界面连接,采用( 中介者 )模式最适合。
- 某旅游公司欲开发—套软件系统,要求能根据季节,节假日等推出不同的旅行定价包,如淡季打折、一口价等。实现该要求适合采用( 策略 )模式,该模式的主要意图是( 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换 )
- 因使用大量的对象而造成很大的存储开销时,适合采用( 享元 )模式进行对象共享,以减少对象数量从而达到较少的内存占用并提升性能。
- 某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。基于上述需求,采用( 责任链模式 )最为合适。
- 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
