软考-软件设计师
为提升专业水平,从2026年开始,考取计算机专业资格水平-中级,今年没过明年继续,直到考过为止
软件设计师(中级)备考知识手册
目录
- 上午题(基础知识):软件工程、面向对象技术、数据结构与算法、计算机组成原理、操作系统、数据库系统、计算机网络、程序设计语言(编译原理)、知识产权与标准化、信息安全、专业英语
- 下午题(应用技术):数据流图DFD、数据库设计E-R图、UML建模、算法设计、程序设计
一、软件工程
分值占比:约13-17分 | 备考建议:分值最高,结合前端经验上手快,重点掌握测试方法和项目管理
1.1 软件生命周期模型
- 瀑布模型:阶段间具有顺序性和依赖性,文档驱动,适合需求明确的project
- 原型模型:快速构建原型,用户反馈后迭代完善,适合需求不明确的项目
- 增量模型:分批次交付功能模块,先核心后次要
- 螺旋模型:结合了瀑布和原型,强调风险分析,适合大型复杂项目
- 敏捷开发:迭代+增量,强调人和交互、可工作的软件、客户协作、响应变化(敏捷宣言4条价值观)
- V模型:开发阶段与测试阶段一一对应(需求→验收测试、概要设计→概要测试、详细设计→单元测试)
1.2 软件开发方法
- 结构化方法:自顶向下、逐步求精,用数据流图(DFD)和数据结构图(SD)描述
- 面向对象方法:用UML建模,封装/继承/多态
- RUP(统一软件开发过程):4个阶段(初始、细化、构建、移交)× 6个工程核心工作流
1.3 软件测试
- 黑盒测试:不考虑内部结构,只测试功能
- 等价类划分:有效等价类 + 无效等价类
- 边界值分析:输入/输出的边界值(如0、1、最大值、最小值)
- 因果图/判定表:多条件组合测试
- 白盒测试:考虑内部逻辑结构
- 语句覆盖:每个语句至少执行一次
- 判定覆盖:每个判定的真假分支至少执行一次
- 条件覆盖:每个判定中每个条件的真假至少各出现一次
- 路径覆盖:覆盖所有可能的执行路径
- 测试阶段:单元测试 → 集成测试 → 确认测试 → 系统测试 → 验收测试
- JUnit:Java单元测试框架
1.4 软件项目管理
- 甘特图:用条形图表示项目进度,横轴为时间,纵轴为活动
- PERT图(计划评审技术):用有向图表示项目活动,关键路径法(CPM)找最长路径
- CMMI:能力成熟度模型集成,5个等级
- 初始级(Level 1):过程无序,经常超支超时
- 可管理级(Level 2):有基本项目管理过程
- 已定义级(Level 3):标准过程已文档化
- 已量化管理级(Level 4):过程用统计数据量化管理
- 优化级(Level 5):持续过程改进
1.5 软件质量
- ISO 9126质量模型:6个特性
- 功能性、可靠性、可用性、效率、维护性、可移植性
- McCall质量模型:11个质量因素
1.6 例题
例题1:在软件测试中,要求覆盖程序中所有可能的执行路径的测试方法是( )
A. 语句覆盖 B. 判定覆盖 C. 条件覆盖 D. 路径覆盖
答案:D
解析:路径覆盖要求覆盖程序中所有可能的执行路径,是白盒测试中覆盖标准最强的一种。语句覆盖只要求每个语句至少执行一次;判定覆盖要求每个判定的真假分支都至少执行一次;条件覆盖要求每个判定中每个条件的真假至少各出现一次。路径覆盖的覆盖强度最高。
例题2:以下关于CMMI的描述,正确的是( )
A. CMMI共有4个成熟度等级 B. 最高等级是已定义级 C. 优化级强调持续过程改进 D. 初始级表示过程已量化管理
答案:C
解析:CMMI共有5个等级,最高级是优化级(Level 5),强调通过统计技术和持续改进来优化过程。初始级(Level 1)表示过程无序,经常超支超时。已定义级是Level 3。
二、面向对象技术
分值占比:约11-15分 | 备考建议:分值高,前端有组件经验,UML和设计模式上手快
2.1 面向对象基本概念
- 封装:将数据和操作封装在类中,隐藏内部实现细节
- 继承:子类继承父类的属性和方法,支持代码复用
- 多态:同一操作作用于不同对象可以有不同的解释和行为(运行时分派)
- 抽象:提取共同特征,忽略细节(抽象类、接口)
2.2 UML建模
- 类图:表示类的静态结构
- 泛化(继承):空心三角箭头实线
- 实现:空心三角箭头虚线
- 关联:实线箭头
- 聚合:空心菱形+实线(整体与部分可独立存在)
- 组合:实心菱形+实线(整体与部分不可独立存在)
- 依赖:虚线箭头
- 用例图:表示系统功能需求
- 参与者(小人)与用例(椭圆)
- 关联、包含(<<include>>)、扩展(<<extend>>)
- 时序图:表示对象间消息传递的时间顺序
- 对象(矩形)+ 生命线(虚线)+ 消息(箭头)
- 同步消息(实线箭头)、异步消息(虚线箭头)、返回消息(虚线箭头)
- 状态图:表示对象生命周期中的状态变化
- 状态(圆角矩形)、转换(箭头)、事件、动作
- 活动图:类似流程图,表示业务流程
2.3 设计模式
- 单例模式:确保一个类只有一个实例,提供全局访问点
- 应用场景:配置管理器、数据库连接池、线程池
- 工厂模式:定义创建对象的接口,让子类决定实例化哪个类
- 简单工厂、工厂方法、抽象工厂
- 观察者模式:定义对象间的一对多依赖,当一个对象改变状态时所有依赖者收到通知
- 应用场景:事件监听器、发布-订阅系统
- 适配器模式:将一个接口转换成客户希望的另一个接口
- 类适配器(多重继承)、对象适配器(组合)
- 策略模式:定义一系列算法,把它们封装起来,并使它们可互换
- 应用场景:排序策略、加密策略
- 开闭原则(OCP):对扩展开放,对修改关闭
- 里氏替换原则(LSP):子类对象能够替换其父类对象
- 依赖倒置原则(DIP):高层模块不应依赖低层模块,二者都应依赖抽象
2.4 例题
例题1:在UML类图中,表示"班级"和"学生"之间的关系,一个班级包含多个学生,学生可以脱离班级独立存在,这种关系是( )
A. 组合 B. 聚合 C. 泛化 D. 依赖
答案:B
解析:聚合表示"整体-部分"关系,但部分可以脱离整体独立存在。班级和学生之间,学生可以脱离班级存在,所以是聚合关系(空心菱形)。如果是"电脑和CPU"这种不可分割的关系,才是组合(实心菱形)。
例题2:某系统需要支持多种支付方式(支付宝、微信支付、银行卡),且未来可能新增支付方式。最符合开闭原则的设计模式是( )
A. 单例模式 B. 策略模式 C. 观察者模式 D. 适配器模式
答案:B
解析:策略模式定义一系列算法(支付方式),封装它们并使它们可互换。新增支付方式只需新增一个策略类,无需修改已有代码,符合开闭原则。
三、数据结构与算法
分值占比:约9-12分 | 备考建议:核心难点,重点掌握排序复杂度、二叉树性质、遍历算法
3.1 线性结构
- 数组:连续内存存储,随机访问O(1)
- 链表:非连续内存,通过指针连接
- 单链表、双链表、循环链表
- 插入/删除O(1)(已知节点),查找O(n)
- 栈:后进先出(LIFO),操作只在栈顶
- 应用:函数调用栈、表达式求值、括号匹配
- 队列:先进先出(FIFO)
- 循环队列:解决假溢出
- 优先级队列:按优先级出队
- 双端队列:两端都可入队出队
3.2 树与二叉树
- 二叉树性质:
- 第i层最多2^(i-1)个节点
- 深度为k的二叉树最多2^k - 1个节点
- 叶子节点数n0 = 度为2的节点数n2 + 1
- 完全二叉树:除最后一层外,其他层节点数都达到最大值,最后一层节点靠左排列
- 性质:节点i的左孩子为2i,右孩子为2i+1,父节点为i/2向下取整
- 二叉树遍历:
- 先序:根→左→右
- 中序:左→根→右
- 后序:左→右→根
- 已知先序+中序可唯一确定二叉树
- 哈夫曼树:带权路径长度最小的二叉树
- 构造方法:每次选权值最小的两棵树合并
- 哈夫曼编码:前缀编码,无歧义解码
- 平衡二叉树(AVL):任意节点左右子树高度差不超过1
3.3 图
- 图的存储:邻接矩阵、邻接表
- 遍历:
- DFS(深度优先搜索):递归/栈,类似树的先序遍历
- BFS(广度优先搜索):队列,按层遍历
- 最小生成树:Prim算法、Kruskal算法
- 最短路径:Dijkstra算法(单源最短路径,不支持负权边)、Floyd算法(多源最短路径)
3.4 排序算法
| 排序算法 | 最好时间 | 平均时间 | 最坏时间 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
| 简单选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |
| 直接插入排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(n log n) | O(n log n) | O(n²) | O(1) | 不稳定 |
| 快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | 不稳定 |
3.5 查找算法
- 二分查找:要求有序表,时间复杂度O(log n)
- Hash表:通过哈希函数将关键字映射到存储位置,平均查找O(1)
- 冲突处理:链地址法、开放定址法
3.6 算法设计策略
- 分治法:将问题分解为若干小问题,递归求解后合并
- 典型:归并排序、快速排序、二分查找
- 动态规划:将问题分解为重叠子问题,保存子问题解避免重复计算
- 典型:斐波那契数列、背包问题、最长公共子序列
- 贪心法:每一步选当前最优解,期望得到全局最优
- 典型:Huffman编码、Dijkstra、最小生成树Kruskal
- 回溯法:深度优先搜索+剪枝,逐步构建解,不满足条件就回溯
- 典型:八皇后问题、0-1背包
3.7 例题
例题1:一棵完全二叉树有100个节点,则叶子节点的个数为( )
A. 49 B. 50 C. 51 D. 52
答案:C
解析:完全二叉树中,叶子节点数n0 = n2 + 1。总节点数n = n0 + n1 + n2 = 100。对于完全二叉树,n1只能是0或1。若n1=0,则2n0 = 100,n0=50,但n0=n2+1,n2=49,n0+n2=99≠100,矛盾。若n1=1,则n0+n2=99,n0=n2+1,解得n0=50,n2=49... 等等,重新算:n = n0 + n1 + n2 = 100,n0 = n2 + 1,所以n2 = n0 - 1,代入得n0 + n1 + n0 - 1 = 100,即2n0 + n1 = 101。若n1=1,则2n0=100,n0=50。不对,让我重新算。n0 = n2 + 1,n = n0 + n1 + n2 = n0 + n1 + (n0-1) = 2n0 + n1 - 1 = 100,所以2n0 + n1 = 101。完全二叉树n1只能是0或1。若n1=1,则2n0=100,n0=50。但2×50+1=101≠100... 重新来:n0+n1+n2=100, n0=n2+1, 所以(n2+1)+n1+n2=100, 2n2+n1=99。若n1=1, 2n2=98, n2=49, n0=50。不对,答案是51。让我用公式:对于完全二叉树,若节点数n为偶数,n1=2;若n为奇数,n1=0。n=100为偶数,n1=2?不对。
正确解法:n0 = floor((n+1)/2) = floor(101/2) = 50... 不对。
对于完全二叉树:n0 = (n+1)/2 当n为奇数;n0 = n/2 当n为偶数。n=100为偶数,n0=50。
等等,让我用另一个公式:n0 = n - n1 - n2, n2 = n0 - 1, 所以n0 = n - n1 - (n0-1) = n - n1 - n0 + 1, 2n0 = n - n1 + 1, n0 = (n - n1 + 1)/2。
n=100,完全二叉树中,若n为偶数则n1=2?不对,完全二叉树的n1只能是0或1。
n0 = (100 - n1 + 1)/2 = (101 - n1)/2。若n1=1,n0=50。若n1=0,n0=101/2不是整数。
所以n1=1, n0=50, n2=49。答案是B. 50。
抱歉,让我重新确认。完全二叉树节点数n=100。
性质:n0 = n2 + 1
n = n0 + n1 + n2 = n0 + n1 + n0 - 1 = 2n0 + n1 - 1 = 100
2n0 = 101 - n1
n1只能是0或1(完全二叉树性质)。
- n1=0: 2n0=101, n0=50.5 不是整数
- n1=1: 2n0=100, n0=50
所以n0=50,答案是B。
答案:B
例题2:以下排序算法中,平均时间复杂度为O(n log n)且稳定的排序算法是( )
A. 快速排序 B. 堆排序 C. 归并排序 D. 希尔排序
答案:C
解析:归并排序的平均时间复杂度为O(n log n),且是稳定排序。快速排序平均O(n log n)但不稳定;堆排序平均O(n log n)但不稳定;希尔排序平均O(n log n)但不稳定。
四、计算机组成原理
分值占比:约5-8分 | 备考建议:公式为主,背公式套数字即可拿分
4.1 数据表示与运算
- 原码:最高位为符号位(0正1负),其余位为数值绝对值
- 反码:正数反码=原码;负数反码=符号位不变,数值位按位取反
- 补码:正数补码=原码;负数补码=反码+1
- 补码优势:可将减法运算转化为加法运算
- 补码范围:n位补码表示范围 -2^(n-1) 到 2^(n-1)-1
- 移码:补码符号位取反,用于浮点数阶码表示
- 浮点数表示:
- 格式:阶符+阶码(基数)+ 尾符+尾数
- 规格化:尾数最高位非0(二进制规格化要求尾数绝对值≥0.5)
- 浮点数精度由尾数位数决定,范围由阶码位数决定
4.2 校验码
- 奇偶校验:检测1位错误,不能纠正错误
- 奇校验:使包括校验位在内的"1"的个数为奇数
- 偶校验:使包括校验位在内的"1"的个数为偶数
- 海明码:可检测并纠正1位错误
- 校验位位数k需满足:2^k ≥ n + k + 1(n为数据位数)
- 校验位放在2的幂次位置(1,2,4,8,...)
- CRC校验(循环冗余校验):
- 用生成多项式G(x)进行模2除法
- 可检测所有1位错误、所有2位错误、所有奇数个错误
- 不能检测的错误:与G(x)相同因子的错误
4.3 指令系统与CPU
- 指令格式:操作码 + 地址码(操作数地址)
- 寻址方式:
- 立即寻址:操作数直接在指令中
- 直接寻址:地址码直接给出操作数地址
- 间接寻址:地址码给出的是操作数地址的地址
- 寄存器寻址:操作数在寄存器中
- 寄存器间接寻址:寄存器中存放操作数地址
- 变址寻址:有效地址 = 变址寄存器内容 + 形式地址
- CPU组成:
- 运算器(ALU):执行算术和逻辑运算
- 控制器:取指、译码、执行
- 寄存器组:通用寄存器、PC(程序计数器)、IR(指令寄存器)、MAR(存储器地址寄存器)、MDR(存储器数据寄存器)
4.4 存储器系统
- 存储层次:寄存器 → Cache → 主存 → 辅存
- Cache映射方式:
- 直接映射:主存块只能映射到Cache中固定位置,简单但有冲突
- 全相联映射:主存块可映射到Cache任意位置,灵活但查找慢
- 组相联映射:Cache分成若干组,主存块可映射到对应组内任意位置
- Cache命中率:H = 命中次数/总访问次数
- RAID级别:
- RAID 0:条带化,无冗余,提高性能
- RAID 1:镜像,100%冗余,可靠性最高
- RAID 5:分布式奇偶校验,至少3块盘
- RAID 10:镜像+条带,至少4块盘
4.5 流水线技术
- 流水线吞吐率:TP = n / (t + (n-1)×Δt)
- n为任务数,t为完成任务时间,Δt为流水线周期
- 流水线加速比:S = 非流水线执行时间 / 流水线执行时间
- 流水线瓶颈:各段执行时间不一致时,以最慢段为周期
4.6 例题
例题1:用8位补码表示整数,其表示范围是( )
A. -128 ~ +127 B. -127 ~ +128 C. -128 ~ +128 D. -127 ~ +127
答案:A
解析:n位补码表示范围为 -2^(n-1) ~ 2(n-1)-1。8位补码:-27 ~ 2^7-1,即 -128 ~ +127。注意补码比原码多表示一个数-128(补码中10000000表示-128)。
例题2:某Cache容量为4KB,主存容量为256KB,若采用直接映射方式,则主存地址中,字块内地址和Cache字块地址的位数分别为( )
A. 8, 8 B. 8, 9 C. 9, 8 D. 7, 8
答案:B
解析:主存256KB = 2^18字节,需18位地址。Cache 4KB = 2^12字节,需12位地址。直接映射下,主存地址 = Cache字块地址 + 字块内地址。Cache字块地址 = Cache块数 = Cache容量/块大小。假设块大小为28=256B(字块内地址8位),则Cache有212/28=24=16块,Cache字块地址4位... 这个题目需要具体参数。
实际上,若Cache容量4KB,主存256KB,设块大小为B字节。主存地址位数 = log2(256×1024) = 18位。Cache地址位数 = log2(4×1024) = 12位。直接映射:主存地址 = 标记 + Cache字块地址 + 字块内地址。字块内地址 = log2(B)。Cache字块地址 = log2(4×1024/B) = 12 - log2(B)。
若B=256B(字块内地址8位),Cache字块地址=12-8=4位... 但选项中没有4。
重新看选项,字块内地址8位意味着块大小256B。Cache字块地址:Cache有4KB/256B=16块,需要4位。但选项B是8,9...
这道题可能需要不同的块大小假设。假设字块内地址为8位(块大小256B),Cache字块地址应为4位,但选项中没有。可能题目参数不同。
答案:B(根据常见考题模式,字块内地址8位,Cache字块地址9位,对应Cache有512块,块大小为4KB/512=8B,字块内地址3位... 这里需要具体参数)
五、操作系统
分值占比:约6-10分 | 备考建议:进程调度和页面置换是核心考点
5.1 进程管理
- 进程三态模型:就绪 → 运行 → 阻塞
- 就绪→运行:进程调度
- 运行→就绪:时间片到/被抢占
- 运行→阻塞:等待事件
- 阻塞→就绪:事件发生
- 五态模型:增加新建态和终止态
- 进程调度算法:
- FCFS(先来先服务):非抢占,可能长作业等待时间长
- SJF(短作业优先):平均等待时间最短,但可能饥饿
- RR(时间片轮转):每个进程分配固定时间片,公平
- 优先级调度:高优先级先执行,可抢占或非抢占
- PV操作(信号量):
- P操作:申请资源,信号量减1,若<0则阻塞
- V操作:释放资源,信号量加1,若≤0则唤醒等待进程
- 生产者-消费者问题:用互斥信号量+空/满信号量解决
- 死锁:
- 四个必要条件:互斥、请求与保持、不剥夺、循环等待
- 银行家算法:分配资源前检查系统是否处于安全状态
- 安全序列:存在一个进程序列,每个进程都能获得所需资源并完成
5.2 存储管理
- 分页存储管理:
- 逻辑地址分为页号和页内地址
- 页表:页号→物理块号的映射
- 页面置换算法:
- FIFO:先进先出,可能Belady异常
- LRU:最近最久未使用,性能好但开销大
- OPT:最佳置换(理想算法,页面走向已知),缺页率最低
- 分段存储管理:
- 逻辑地址分为段号和段内地址
- 段表:段号→段起始地址和段长
- 段页式存储管理:先分段再分页,结合两者优点
5.3 文件管理
- 文件目录结构:
- 单级目录:简单但有冲突
- 两级目录:用户目录+系统目录
- 树形目录:层次化管理,支持共享
- 索引节点(inode):文件控制块,存储文件元数据
- 磁盘调度算法:
- FCFS:先来先服务
- SSTF(最短寻道时间优先):选距当前磁头最近的
- SCAN(电梯算法):单向扫描,到端点反向
- C-SCAN:单向扫描,到端点立即返回起点
5.4 设备管理
- I/O控制方式:程序查询、程序中断、DMA、通道
- SPOOLing技术:将独占设备改造为共享设备,提高利用率
5.5 例题
例题1:在操作系统中,采用银行家算法可以避免( )
A. 死锁 B. 死锁的恢复 C. 死锁的预防 D. 死锁的检测
答案:A
解析:银行家算法是一种死锁避免算法。它通过在资源分配前检查系统是否处于安全状态来避免死锁。死锁预防是通过破坏死锁四个必要条件之一来实现;死锁检测是允许死锁发生然后检测并恢复;死锁恢复是在检测到死锁后采取措施。银行家算法属于死锁避免。
例题2:某系统采用LRU页面置换算法,分配给某进程3个物理块,页面访问序列为:1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。缺页次数为( )
A. 8 B. 9 C. 10 D. 11
答案:B
解析:用LRU算法模拟页面置换过程:
- 访问1:缺页,装入1,内存{1}
- 访问2:缺页,装入2,内存{1,2}
- 访问3:缺页,装入3,内存{1,2,3}
- 访问4:缺页,LRU淘汰1,内存{4,2,3}
- 访问1:缺页,LRU淘汰2,内存{4,1,3}
- 访问2:缺页,LRU淘汰3,内存{4,1,2}
- 访问5:缺页,LRU淘汰4,内存{5,1,2}
- 访问1:命中,内存{5,1,2}
- 访问2:命中,内存{5,1,2}
- 访问3:缺页,LRU淘汰5,内存{3,1,2}
- 访问4:缺页,LRU淘汰1,内存{3,4,2}
- 访问5:缺页,LRU淘汰2,内存{3,4,5}
缺页次数 = 9次。答案是B。
六、数据库系统
分值占比:约6-10分 | 备考建议:E-R图和范式是下午题核心,关系代数和SQL是上午题重点
6.1 E-R模型
- 实体:客观存在并可相互区别的事物
- 属性:实体所具有的某一特性
- 简单属性/组合属性
- 单值属性/多值属性(用双椭圆表示)
- 派生属性(可派生,用虚线椭圆表示)
- 联系:实体集之间的关联
- 1:1(一对一)、1:n(一对多)、m:n(多对多)
- 联系也可有属性
- E-R图转关系模式:
- 1个实体→1个关系模式
- 1:1联系→转换为1个关系模式,或并入任一端实体
- 1:n联系→转换为1个关系模式,或并入n端实体
- m:n联系→转换为1个关系模式,属性包括两端主键+联系属性,主键为两端主键组合
6.2 关系代数
- 选择(σ):从关系中选取满足条件的元组(水平分割)
- 投影(π):从关系中选取若干属性列(垂直分割)
- 连接(⋈):从两个关系的笛卡尔积中选取满足条件的元组
- 等值连接:连接条件为属性值相等
- 自然连接:等值连接+去除重复属性
- 除(÷):R÷S,求R中哪些元组在S的所有元组上都出现
6.3 SQL语言
- 数据查询:
- SELECT...FROM...WHERE(选择+投影)
- 连接查询:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
- 分组统计:GROUP BY + HAVING
- 嵌套查询:IN、EXISTS、ANY/ALL、比较运算符
- 数据定义:CREATE TABLE、ALTER TABLE、DROP TABLE
- 数据控制:GRANT、REVOKE
6.4 范式理论
- 1NF:每个属性都是不可再分的原子值
- 2NF:满足1NF,且每个非主属性完全函数依赖于候选键(消除部分依赖)
- 3NF:满足2NF,且不存在非主属性对候选键的传递依赖
- BCNF:满足3NF,且每个决定因素都包含候选键
6.5 事务与并发控制
- ACID特性:
- 原子性(Atomicity):事务中所有操作要么全做要么全不做
- 一致性(Consistency):事务前后数据库从一个一致性状态到另一个一致性状态
- 隔离性(Isolation):并发事务之间不干扰
- 持久性(Durability):事务一旦提交,对数据库的改变是永久的
- 事务隔离级别(从低到高):
- 读未提交(Read Uncommitted):可能脏读
- 读已提交(Read Committed):避免脏读,可能不可重复读
- 可重复读(Repeatable Read):避免脏读和不可重复读,可能幻读
- 串行化(Serializable):最高隔离级别,避免所有问题
- 锁机制:
- 共享锁(S锁/读锁):允许多个事务同时读
- 排他锁(X锁/写锁):只允许一个事务写
6.6 例题
例题1:关系R(A,B,C,D)的候选键为AB,函数依赖集F={A→C, B→D},则该关系最高满足( )
A. 1NF B. 2NF C. 3NF D. BCNF
答案:B
解析:候选键为AB,非主属性为C和D。存在函数依赖A→C和B→D,即非主属性C部分依赖于候选键AB(只依赖A),非主属性D部分依赖于候选键AB(只依赖B)。这违反了2NF的要求(非主属性必须完全依赖于候选键),所以不满足2NF...
等等,A→C中A是候选键AB的真子集,所以C部分依赖于AB。B→D中B是候选键AB的真子集,所以D部分依赖于AB。这违反了2NF,所以只满足1NF。
答案:A
例题2:事务T1对数据A加共享锁,事务T2对数据A加排他锁。以下说法正确的是( )
A. T1和T2可以同时获得锁 B. T2可以立即获得锁 C. T2必须等待T1释放锁 D. T1必须等待T2释放锁
答案:C
解析:共享锁(S锁)和排他锁(X锁)不兼容。T1已持有A的S锁,T2申请A的X锁时,由于S锁和X锁不兼容,T2必须等待T1释放S锁后才能获得X锁。
七、计算机网络
分值占比:约5-10分 | 备考建议:OSI模型和TCP/IP协议是核心,子网划分必考
7.1 网络体系结构
- OSI七层模型:
- 物理层:比特流传输,设备有集线器、中继器
- 数据链路层:帧的传输,设备有交换机、网桥,MAC地址
- 网络层:路由选择,设备有路由器,IP地址
- 传输层:端到端可靠传输,TCP/UDP协议
- 会话层:建立、管理、终止会话
- 表示层:数据格式转换、加密/解密、压缩/解压缩
- 应用层:HTTP、FTP、SMTP、DNS、DHCP等协议
- TCP/IP四层模型:
- 网络接口层(对应OSI物理层+数据链路层)
- 网际层(对应OSI网络层)
- 传输层(对应OSI传输层)
- 应用层(对应OSI会话层+表示层+应用层)
7.2 传输层协议
- TCP:面向连接、可靠传输
- 三次握手建立连接:SYN→SYN+ACK→ACK
- 四次挥手释放连接:FIN→ACK→FIN→ACK
- 流量控制:滑动窗口
- 拥塞控制:慢启动、拥塞避免、快重传、快恢复
- UDP:无连接、不可靠传输、速度快
- 适用于实时应用(视频会议、直播、DNS查询)
7.3 网络层协议
- IP地址分类:
- A类:1.0.0.0 ~ 126.255.255.255,默认掩码255.0.0.0
- B类:128.0.0.0 ~ 191.255.255.255,默认掩码255.255.0.0
- C类:192.0.0.0 ~ 223.255.255.255,默认掩码255.255.255.0
- D类(组播):224.0.0.0 ~ 239.255.255.255
- E类(保留):240.0.0.0 ~ 255.255.255.255
- 特殊地址:127.0.0.0(回环地址)
- 子网划分:
- 通过借主机位作为子网位来划分
- 子网掩码:将网络位全1、主机位全0的二进制数
- 可用主机数 = 2^n - 2(n为主机位数,减2是减去网络地址和广播地址)
- ARP协议:将IP地址解析为MAC地址
- DHCP协议:动态分配IP地址
7.4 应用层协议
- HTTP:超文本传输协议,默认端口80,HTTPS加密端口443
- DNS:域名解析服务,将域名解析为IP地址
- FTP:文件传输协议,默认端口21
- SMTP:简单邮件传输协议,默认端口25
- POP3:邮件接收协议,默认端口110
7.5 网络安全基础
- 防火墙:在内部网络和外部网络之间设置安全屏障
- VPN:虚拟专用网,通过隧道协议在公共网络上建立安全通道
- SSL/TLS:安全套接层/传输层安全协议,提供加密通信
7.6 例题
例题1:IP地址192.168.1.100的子网掩码为255.255.255.0,则该网络中最多可容纳的主机数为( )
A. 254 B. 255 C. 256 D. 252
答案:A
解析:子网掩码255.255.255.0表示前24位为网络位,后8位为主机位。主机位有8位,可分配主机数 = 2^8 - 2 = 254(减去全0的网络地址和全1的广播地址)。
例题2:TCP三次握手中,第二次握手发送的报文段标志位为( )
A. SYN B. ACK C. SYN+ACK D. FIN
答案:C
解析:三次握手过程:
- 客户端发送SYN报文段,进入SYN_SENT状态
- 服务器收到SYN后,发送SYN+ACK报文段,进入SYN_RCVD状态
- 客户端收到SYN+ACK后,发送ACK报文段,进入ESTABLISHED状态
所以第二次握手发送的是SYN+ACK。
八、程序设计语言(编译原理)
分值占比:约5-8分 | 备考建议:文法分类和自动机是核心考点
8.1 文法与语言
- 乔姆斯基文法分类:
- 0型文法(无限制文法):产生式α→β,α至少含一个非终结符,等价于图灵机
- 1型文法(上下文有关文法):产生式αAβ→αγβ,A为非终结符
- 2型文法(上下文无关文法):产生式A→γ,A为非终结符,等价于下推自动机
- 3型文法(正则文法):产生式A→aB或A→a,等价于有限自动机
- 正规式:描述正则语言的数学工具
- 运算:并(+)、连接(·)、闭包(*)
- 正规式与正规集一一对应
8.2 有限自动机
- NFA(非确定有限自动机):一个输入可能对应多个状态转移
- DFA(确定有限自动机):每个状态对每个输入只有一个转移
- NFA可等价转换为DFA(子集构造法)
- DFA最小化:状态合并,消除等价状态
8.3 编译过程
- 词法分析:将源代码字符流转换为词法单元(Token)序列
- 词法单元:关键字、标识符、常数、运算符、分隔符
- 输出:Token序列
- 语法分析:根据文法规则,将Token序列组织成语法树
- 自顶向下分析:递归下降、LL(1)
- 自底向上分析:算符优先、LR分析
- 语义分析:检查语义正确性(类型检查、变量声明检查)
- 中间代码生成:生成与机器无关的中间代码
- 优化:对中间代码进行优化
- 目标代码生成:生成机器可执行代码
8.4 参数传递
- 值传递:将实参的值复制给形参,形参修改不影响实参
- 引用传递:形参引用实参的内存地址,形参修改影响实参
- 名称传递:将实参表达式文本替换到形参位置
8.5 例题
例题1:以下文法中,属于上下文无关文法的是( )
A. A → aA | ε B. aAb → acb C. AB → BA D. A → aBc
答案:D
解析:上下文无关文法的产生式形式为A→γ,其中A是单个非终结符。A选项A→aA|ε是正则文法(也是上下文无关文法的特例);B选项aAb→acb的左边不是单个非终结符,是上下文有关文法;C选项AB→BA左边有两个符号,是上下文有关文法;D选项A→aBc左边是单个非终结符A,是上下文无关文法。
例题2:在编译过程中,负责将源代码中的标识符、常数、运算符等分解为词法单元的阶段是( )
A. 语法分析 B. 词法分析 C. 语义分析 D. 中间代码生成
答案:B
解析:词法分析是编译的第一个阶段,负责将源代码字符流分解为词法单元(Token)序列。语法分析将Token序列组织成语法树;语义分析检查语义正确性;中间代码生成将语法树转换为中间代码。
九、知识产权与标准化
分值占比:约3分 | 备考建议:纯背诵,保护期限数字是核心
9.1 著作权
- 保护期限:
- 署名权、修改权、保护作品完整权:永久保护
- 发表权、复制权等财产权:作者终生 + 死后50年
- 法人作品/职务作品:首次发表后50年(50年内未发表则不再保护)
- 权利归属:
- 职务作品(完成单位任务):除署名权外归单位
- 委托作品(外包):有约定从约定;没约定归受托方
- 合作作品:共同享有
- 职务发明:专利权归单位
- 软件著作权:开发完成之日自动产生,无需登记
- 保护对象:源程序、目标程序、文档
- 不保护:开发思想、处理过程、操作方法
9.2 专利权
- 发明专利:保护期限20年(从申请日算)
- 实用新型专利:保护期限10年(从申请日算)
- 外观设计专利:保护期限15年(从申请日算,2021年新法)
- 专利侵权判定:全面覆盖原则(被控侵权产品包含专利权利要求中全部技术特征)
9.3 商标权
- 注册商标有效期:10年(从核准注册日算),可无限续展
- 商标侵权:未经许可在相同/类似商品上使用相同/近似商标
9.4 商业秘密
- 特点:不为公众所知、具有商业价值、权利人采取了保密措施
- 保护期限:不确定(一旦公开,不再受保护)
- 与专利权的关系:专利要公开技术内容,商业秘密要保密,二者不能同时拥有
9.5 标准化
- 标准代号:
- GB:强制性国家标准
- GB/T:推荐性国家标准
- ISO:国际标准(国际标准化组织)
- ANSI:美国国家标准
- JIS:日本工业标准
- IEEE:美国电气电子工程师学会标准
- DB:地方标准(如DB11为北京)
- Q/:企业标准
- JB:机械行业标准
- YD:通信行业标准
9.6 例题
例题1:某公司开发了一套软件并进行了著作权登记。该软件著作权自( )起产生。
A. 软件首次发表时 B. 软件开发完成之日 C. 著作权登记之日 D. 软件公开发布时
答案:B
解析:软件著作权自开发完成之日起自动产生,无需登记。登记只是为了方便举证,不是权利产生的条件。
例题2:以下关于知识产权的说法,正确的是( )
A. 发明专利保护期限为10年 B. 注册商标可无限续展 C. 商业秘密保护期限为20年 D. 著作权保护包括开发思想
答案:B
解析:A错误,发明专利保护期限为20年;B正确,注册商标10年有效期可无限续展;C错误,商业秘密无固定期限,一旦公开即不再受保护;D错误,著作权保护表达形式,不保护思想、方法、过程。
十、信息安全
分值占比:约5分 | 备考建议:加密技术和数字签名是核心考点
10.1 加密技术
- 对称加密:加密和解密使用相同密钥
- DES:数据加密标准,密钥56位,已不安全
- 3DES:DES的增强版,使用3次DES
- AES:高级加密标准,密钥128/192/256位,目前安全
- 非对称加密:公钥加密、私钥解密
- RSA:基于大数分解的困难性
- 特点:公钥公开、私钥保密,可用于加密和数字签名
- 缺点:速度比对称加密慢很多
10.2 数字签名与报文摘要
- 数字签名:用发送方的私钥加密消息摘要,接收方用发送方公钥验证
- 作用:身份认证、不可否认性、完整性
- 报文摘要:对消息进行哈希运算,生成固定长度的摘要
- MD5:生成128位摘要,已被证明不安全
- SHA-1:生成160位摘要
- SHA-256:生成256位摘要,目前安全
- 数字证书:由CA(证书授权中心)签发,包含公钥和身份信息
10.3 网络安全
- 防火墙:在内部网络和外部网络之间设置安全屏障
- 包过滤防火墙:工作在网络层
- 应用代理防火墙:工作在应用层
- VPN(虚拟专用网):通过隧道协议在公共网络上建立安全通道
- 入侵检测系统(IDS):监控网络流量,检测可疑行为
10.4 访问控制
- DAC(自主访问控制):资源所有者决定谁能访问
- MAC(强制访问控制):系统强制分配安全标签
- RBAC(基于角色的访问控制):通过角色分配权限
10.5 例题
例题1:以下关于对称加密和非对称加密的说法,正确的是( )
A. 对称加密速度比非对称加密慢 B. 非对称加密使用相同密钥 C. 对称加密适合大数据量加密 D. 非对称加密不适合数字签名
答案:C
解析:A错误,对称加密速度比非对称加密快;B错误,非对称加密使用公钥和私钥两个不同的密钥;C正确,对称加密速度快,适合大数据量加密;D错误,非对称加密可用于数字签名(用私钥签名,公钥验证)。
例题2:数字签名的作用是( )
A. 保证数据机密性 B. 保证数据完整性和身份认证 C. 防止病毒攻击 D. 防止DDoS攻击
答案:B
解析:数字签名提供身份认证(确认发送方身份)和不可否认性(发送方不能否认发送过该消息),同时通过哈希值验证数据完整性。数字签名不保证数据机密性(加密才保证机密性),也不防病毒或DDoS攻击。
十一、专业英语
分值占比:约5分 | 备考建议:常见缩写和技术词汇,平时积累即可
11.1 常见计算机英文缩写
- CPU:Central Processing Unit(中央处理器)
- GPU:Graphics Processing Unit(图形处理器)
- OS:Operating System(操作系统)
- DBMS:Database Management System(数据库管理系统)
- HTTP:HyperText Transfer Protocol(超文本传输协议)
- HTTPS:HTTP Secure(安全超文本传输协议)
- HTML:HyperText Markup Language(超文本标记语言)
- CSS:Cascading Style Sheets(层叠样式表)
- JSON:JavaScript Object Notation(JavaScript对象表示法)
- XML:eXtensible Markup Language(可扩展标记语言)
- SQL:Structured Query Language(结构化查询语言)
- API:Application Programming Interface(应用程序编程接口)
- IDE:Integrated Development Environment(集成开发环境)
- URL:Uniform Resource Locator(统一资源定位符)
- DNS:Domain Name System(域名系统)
- IP:Internet Protocol(网际协议)
- TCP:Transmission Control Protocol(传输控制协议)
- UDP:User Datagram Protocol(用户数据报协议)
- SSL:Secure Sockets Layer(安全套接层)
- TLS:Transport Layer Security(传输层安全)
- RAM:Random Access Memory(随机存取存储器)
- ROM:Read-Only Memory(只读存储器)
- SSD:Solid State Drive(固态硬盘)
- RAID:Redundant Array of Independent Disks(独立磁盘冗余阵列)
- VM:Virtual Machine(虚拟机)
- Docker:容器化部署平台
- ORM:Object-Relational Mapping(对象关系映射)
11.2 技术文档阅读技巧
- 关注关键词:requirement(需求)、interface(接口)、parameter(参数)、return value(返回值)
- 注意时态:一般现在时描述功能,过去时描述已实现的功能
- 注意条件句:if/when/unless引导的条件从句
11.3 例题
例题1:In software engineering, the process of converting high-level programming language code into machine code is called( )
A. Interpretation B. Compilation C. Execution D. Debugging
答案:B
解析:Compilation(编译)是将高级语言源代码转换为机器码的过程。Interpretation(解释)是逐行解释执行,不生成独立的机器码。Execution(执行)是运行程序。Debugging(调试)是查找和修复错误的过程。
例题2:Which of the following is NOT a feature of object-oriented programming?( )
A. Encapsulation B. Inheritance C. Compilation D. Polymorphism
答案:C
解析:面向对象编程的三大特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。Compilation(编译)是编程语言的处理方式,不是面向对象编程的特征。
十二、数据流图(DFD)—— 下午题第1题(必答)
分值占比:约7-8分 | 备考建议:有固定套路,练3-5套真题即可掌握
12.1 DFD基本元素
- 外部实体(矩形):系统外部的数据源或数据目的地
- 加工/处理(圆/椭圆):对数据进行处理的逻辑
- 数据存储(双横线/开口矩形):数据的存储位置
- 数据流(箭头):数据的流动方向
12.2 DFD分层
- 顶层图(上下文图):只有1个加工(整个系统),展示系统与外部实体的交互
- 0层图:将顶层图的加工分解为多个子加工
- 1层图、2层图...:继续细化
12.3 数据守恒原则
- 输入=输出:每个加工必须有输入和输出
- 父图与子图平衡:父图中某个加工的数据流,必须在对应的子图中有相同的输入和输出数据流
- 父外部实体:顶层图中的外部实体,在0层图中必须出现
- 父数据存储:顶层图中的数据存储,在0层图中必须出现
12.4 常见考点与解题技巧
- 补外部实体:看数据流的起点/终点,如果数据流从系统外部来或到系统外部去,则对应外部实体
- 补数据存储:如果一个加工的输出需要被另一个加工使用,但不是直接传递,则需要数据存储
- 补数据流:检查每个加工的输入输出是否守恒
- 找错误:
- 外部实体之间直接有数据流(错误,必须经过加工)
- 加工只有输入没有输出(错误)
- 数据流没有标注名称(错误)
- 父图与子图数据流不匹配(错误)
12.5 例题
例题1:某图书管理系统DFD中,读者提交借阅请求,系统检查图书是否存在,若存在则记录借阅信息并更新库存。以下关于该系统的描述,正确的是( )
A. 读者是加工 B. 图书库存是外部实体 C. 借阅请求是数据流 D. 检查图书是数据存储
答案:C
解析:读者是外部实体(系统外部的数据源);图书库存是数据存储(保存图书信息);借阅请求是数据流(从读者到系统的信息流);检查图书是加工(对数据进行处理的操作)。
例题2:在DFD中,关于数据守恒原则的描述,错误的是( )
A. 每个加工至少有一个输入数据流和一个输出数据流 B. 父图的输入输出数据流必须与子图一致 C. 外部实体之间可以直接有数据流 D. 数据存储必须有读写数据流
答案:C
解析:外部实体之间不能直接有数据流,数据流必须经过加工处理。A正确,每个加工必须有输入和输出;B正确,父图与子图必须平衡;D正确,数据存储必须有写入和读取的数据流。
十三、数据库设计E-R图 —— 下午题第2题(必答)
分值占比:约7-8分 | 备考建议:E-R图转关系模式是固定套路
13.1 E-R图绘制
- 实体:矩形,内写实体名
- 属性:椭圆,内写属性名,用线连接到实体
- 主键属性加下划线
- 多值属性用双椭圆
- 派生属性用虚线椭圆
- 联系:菱形,内写联系名,用线连接到相关实体
- 在联系线上标注1, n, m表示基数
13.2 E-R图转关系模式
- 实体转换:每个实体转换为1个关系模式,属性包括实体的所有属性,主键保持不变
- 1:1联系转换:转换为1个关系模式,或并入任一端实体的关系模式中
- 1:n联系转换:转换为1个关系模式,或并入n端实体的关系模式中,将1端主键作为外键
- m:n联系转换:转换为1个关系模式,属性包括两端实体的主键+联系本身的属性,主键为两端主键的组合
13.3 主键与外键确定
- 主键:唯一标识关系中元组的属性或属性组合
- 外键:一个关系中的属性(或属性组合),引用另一个关系的主键
13.4 例题
例题1:某学校数据库中,有学生实体(学号、姓名、性别、年龄)和课程实体(课程号、课程名、学分),学生和课程之间是m:n的选修关系(选修成绩)。将该E-R图转换为关系模式后,共得到( )个关系模式。
A. 2 B. 3 C. 4 D. 5
答案:B
解析:学生实体→1个关系模式(学号、姓名、性别、年龄),课程实体→1个关系模式(课程号、课程名、学分),选修m:n关系→1个关系模式(学号、课程号、选修成绩)。共3个关系模式。
例题2:在学生-课程E-R图中,选修关系转换为关系模式后,其主键应为( )
A. 学号 B. 课程号 C. 学号+课程号 D. 选修成绩
答案:C
解析:m:n联系转换为关系模式时,主键为两端实体主键的组合。学生的主键是学号,课程的主键是课程号,所以选修关系的主键是学号+课程号。
十四、UML建模 —— 下午题第3题(必答)
分值占比:约7-8分 | 备考建议:类图关系识别是核心考点
14.1 类图关系
- 泛化(继承):空心三角箭头实线,指向父类
- 实现:空心三角箭头虚线,指向接口
- 关联:实线箭头,有方向性
- 聚合:空心菱形+实线,指向整体
- 表示"has-a"关系,部分可脱离整体存在
- 组合:实心菱形+实线,指向整体
- 表示"contains-a"关系,部分不能脱离整体存在
- 依赖:虚线箭头,指向被依赖的对象
14.2 用例图
- 参与者:小人图标,表示与系统交互的角色
- 用例:椭圆,表示系统提供的功能
- 关联:实线,连接参与者和用例
- 包含(<<include>>):虚线箭头,指向被包含的用例(必须执行)
- 扩展(<<extend>>):虚线箭头,指向扩展的用例(条件满足时才执行)
14.3 时序图
- 对象:矩形,标注对象名:类名
- 生命线:从对象向下延伸的虚线
- 消息:箭头线
- 同步消息:实线实心箭头
- 异步消息:实线空心箭头
- 返回消息:虚线空心箭头
- 激活条:对象生命线上的矩形条,表示对象正在执行操作
14.4 状态图
- 状态:圆角矩形,内写状态名
- 初始状态:实心圆
- 终止状态:带圆圈的实心圆
- 转换:箭头,标注事件[条件]/动作
- 复合状态:状态内嵌套子状态
14.5 例题
例题1:在UML类图中,"汽车"和"发动机"之间的关系最可能是( )
A. 聚合 B. 组合 C. 泛化 D. 依赖
答案:B
解析:汽车和发动机之间是组合关系,因为发动机是汽车的一部分,且不能脱离汽车独立存在。聚合关系表示部分可以脱离整体存在(如"公司"和"部门"),而组合关系表示部分不能脱离整体存在。
例题2:在UML用例图中,<<extend>>关系表示的是( )
A. 基础用例必须包含扩展用例的功能 B. 扩展用例在特定条件下扩展基础用例的功能 C. 两个用例完全独立 D. 扩展用例可以替代基础用例
答案:B
解析:<<extend>>(扩展)关系表示扩展用例在特定条件下才会执行,扩展基础用例的功能。<<include>>(包含)关系表示基础用例必须包含被包含用例的功能。扩展是可选的,包含是必须的。
十五、算法设计 —— 下午题第4题(必答)
分值占比:约7-8分 | 备考建议:识别算法类型是关键,动态规划和分治最常见
15.1 分治法
- 特点:将问题分解为若干规模较小的相同问题,递归求解后合并结果
- 典型题目:归并排序、快速排序、二分查找、最近点对问题
- 代码特征:递归调用+合并操作
15.2 动态规划
- 特点:将问题分解为重叠子问题,保存子问题解避免重复计算
- 典型题目:0-1背包问题、最长公共子序列、矩阵链乘法、编辑距离
- 代码特征:双重循环+状态转移方程+数组记录子问题解
15.3 贪心法
- 特点:每一步选当前最优解,期望得到全局最优
- 典型题目:Huffman编码、Dijkstra最短路径、最小生成树
- 代码特征:循环+贪心选择+排序
15.4 回溯法
- 特点:深度优先搜索+剪枝,逐步构建解,不满足条件就回溯
- 典型题目:八皇后问题、0-1背包(回溯版本)、子集生成
- 代码特征:递归+for循环+回溯(撤销选择)
15.5 解题技巧
- 识别算法类型:
- 有"最优""最大/最小"关键词 → 可能是动态规划或贪心
- 有"分解""合并"关键词 → 可能是分治
- 有"所有解""组合"关键词 → 可能是回溯
- 代码填空:
- 先看递归基(终止条件)
- 再看状态转移(如何从子问题得到当前问题)
- 最后看返回值
15.6 例题
例题1:以下算法中,采用动态规划策略的是( )
A. 归并排序 B. 快速排序 C. 0-1背包问题 D. 二分查找
答案:C
解析:0-1背包问题是典型的动态规划问题,通过构建二维数组记录子问题解来避免重复计算。归并排序和快速排序采用分治策略;二分查找采用分治策略的简化形式。
例题2:某算法的核心代码如下:
for i = 1 to n:
for j = i+1 to n:
if A[j] < A[i]:
swap(A[i], A[j])
该算法采用的策略是( )
A. 分治法 B. 动态规划 C. 贪心法 D. 回溯法
答案:C
解析:该代码是选择排序的变体,每次选择最小元素放到前面,属于贪心策略——每一步选当前最小的元素。分治法需要分解问题递归求解;动态规划需要保存子问题解;回溯法需要递归+回溯。
十六、程序设计 —— 下午题第5/6题(二选一)
分值占比:约7-15分 | 备考建议:选一个语言(Java或C++),掌握5种常用设计模式的代码
16.1 单例模式
java
// 饿汉式
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
// 懒汉式(线程安全)
class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
16.2 工厂模式
java
interface Product {
void use();
}
class ConcreteProductA implements Product {
public void use() { System.out.println("使用产品A"); }
}
class ConcreteProductB implements Product {
public void use() { System.out.println("使用产品B"); }
}
class Factory {
public static Product createProduct(String type) {
if ("A".equals(type)) return new ConcreteProductA();
else if ("B".equals(type)) return new ConcreteProductB();
return null;
}
}
16.3 观察者模式
java
import java.util.*;
interface Observer {
void update(String message);
}
class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer o) { observers.add(o); }
public void detach(Observer o) { observers.remove(o); }
public void notifyObservers(String msg) {
for (Observer o : observers) o.update(msg);
}
}
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) { this.name = name; }
public void update(String message) {
System.out.println(name + " 收到通知: " + message);
}
}
16.4 适配器模式
java
interface Target {
void request();
}
class Adaptee {
public void specificRequest() {
System.out.println("特定请求");
}
}
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) { this.adaptee = adaptee; }
public void request() {
adaptee.specificRequest();
}
}
16.5 策略模式
java
interface Strategy {
int algorithm(int[] data);
}
class QuickSortStrategy implements Strategy {
public int algorithm(int[] data) {
// 快速排序实现
return 0;
}
}
class MergeSortStrategy implements Strategy {
public int algorithm(int[] data) {
// 归并排序实现
return 0;
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy) { this.strategy = strategy; }
public void setStrategy(Strategy strategy) { this.strategy = strategy; }
public int execute(int[] data) {
return strategy.algorithm(data);
}
}
16.6 解题技巧
- 识别设计模式:
- 单例:只有一个实例 → 看是否有static instance + private构造
- 工厂:创建对象 → 看是否有工厂方法根据参数创建不同对象
- 观察者:一对多通知 → 看是否有注册/注销/通知机制
- 适配器:接口转换 → 看是否有中间适配类
- 策略:算法互换 → 看是否有策略接口和多个实现
- 代码填空:
- 先理解类的职责和关系
- 根据方法签名和注释推断代码逻辑
- 注意继承/实现关系中的方法重写
16.7 例题
例题1:某系统需要确保一个配置管理类在整个应用中只有一个实例,且提供全局访问点。该场景最适合使用的设计模式是( )
A. 工厂模式 B. 单例模式 C. 观察者模式 D. 策略模式
答案:B
解析:单例模式确保一个类只有一个实例,并提供全局访问点。配置管理类通常只需要一个实例,适合使用单例模式。
例题2:某系统设计了一个支付模块,支持支付宝、微信支付和银行卡支付三种方式,且未来可能新增支付方式。客户端可以根据需要随时切换支付方式。该场景最适合使用的设计模式是( )
A. 单例模式 B. 工厂模式 C. 策略模式 D. 适配器模式
答案:C
解析:策略模式定义一系列算法(支付方式),封装它们并使它们可互换。客户端可以根据需要随时切换支付方式,符合策略模式的核心思想。工厂模式负责创建对象,但不负责算法的互换;适配器模式负责接口转换;单例模式保证唯一实例。
版权归属:程序员小帅
