news 2026/9/18 18:55:40

Java设计模式复习指南:从23种模式到期末试题实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java设计模式复习指南:从23种模式到期末试题实战

简介:《JAVA设计模式》期末试题归纳PDF文档,面向高校软件工程、计算机等相关专业学生,覆盖考前自测、知识点串联与应试答题框架梳理。卷面按选择题、填空题、名词解释、综合问答四大题型组织,开闭原则、依赖倒置、迪米特法则等设计原则,以及工厂方法、抽象工厂、装饰、备忘录、职责链、组合等模式均有涉及,并专门给出了跨平台实现思路与组合模式结构图实例。资源包共一个PDF文件,大小约53KB,体量不大但考点密度高;目前已有178人学习下载。借助该文档,可快速厘清创建型与行为型模式的边界,掌握单一职责、接口隔离、建造者、解释器等名词解释的关键表述,也能从综合问答中提炼答题思路,适合在考前冲刺阶段高效复习。

1. 一份期末试题归纳PDF,为什么值得当成复习坐标系

期末拿到《JAVA设计模式》试题(A卷)[归纳].pdf,你要做的第一件事不是找原题背诵,而是把它当成一张带考点的知识索引。这类归纳通常会按创建设计模式、结构型模式、行为型模式三个分组把23种设计模式的定义、类图、代码片段和易混点排好,而A卷的题目往往就围绕这些点的排列组合展开。对备考者来说,这份归纳能压缩搜索成本,对准备java面试八股文的开发者来说,它同样是很好的速查清单。真正有效的读法是:先建立一张“模式特征→适用场景→代码骨架”的映射表,再对着题型做定点输出。

2. 从试题归纳看23种设计模式的常考权重与识别特征

2.1 先按分类建坐标,再往坐标里填模式

设计模式在Java考试里不会平均用力。翻看历年归纳会发现,创建型中的单例、工厂,结构型中的适配器、装饰器,行为型中的策略、观察者、模板方法出现频率最高,而原型、享元、解释器等相对低频。复习时要先把23种模式按用途分组:

  • 创建型:解决对象怎么new出来的问题,包括单例、工厂方法、抽象工厂、建造者、原型。
  • 结构型:解决类和对象怎么组织成更大结构的问题,包括适配器、装饰器、外观、享元、组合、桥接、Proxy。
  • 行为型:解决对象之间怎么分配职责和通信的问题,包括策略、观察者、模板方法、责任链、状态、命令、迭代器、中介者、备忘录、访问者、解释器。

把“三组”刻在脑子里,遇到一道题先判断它问的是创建、结构还是行为,答题方向就不会偏。

2.2 常考模式权重表:用一句话识别特征快速定位

我建议把高频考点整理成一张表格,考前扫一遍就能建立条件反射。下表是适合贴在复习页上的精简版本:

模式分组一句话识别特征常考题型
单例(Singleton)创建型整个进程只允许一个实例代码填空、线程安全、懒汉饿汉区别
工厂方法(Factory Method)创建型定义创建对象的接口,让子类决定实例化哪个类类图补全、代码实现
抽象工厂(Abstract Factory)创建型创建一组相关或依赖的对象,不暴露具体类选择题、简答对比
建造者(Builder)创建型把复杂对象的构造过程拆成一步步设置与工厂模式的区别题
适配器(Adapter)结构型把一个接口转换成客户端期望的另一个接口画图题、代码填空
装饰器(Decorator)结构型动态给对象添加职责,比继承更灵活与继承对比、代码实现
外观(Facade)结构型为子系统提供一个统一的高层接口简答题、场景识别
Proxy结构型为另一个对象提供一个替身,控制访问Spring AOP场景题
策略(Strategy)行为型把一族算法分别封装,使它们可以互相替换代码实现题高频
观察者(Observer)行为型对象间一对多依赖,状态变化自动通知事件机制、发布订阅场景
模板方法(Template Method)行为型父类定义算法骨架,子类实现可变步骤代码填空、继承应用
责任链(Chain of Responsibility)行为型多个对象有机会处理请求,沿链传递审批流、过滤器场景

读表时注意最后一列,它反映的是A卷的命题习惯:概念题考识别,代码题考骨架,画图题考关系。这张表本身就可以由PDF里的知识点重新归纳生成,花十分钟整理,比直接背诵原文更有效。

2.3 把每个模式压缩成一个“触发器短语”

背诵模式定义最忌讳完整复述教科书原话。考试时间有限,看到题干就应触发对应短语。例如:

  • 看到“唯一实例”触发单例。
  • 看到“不修改源码扩展类型”触发开闭原则和工厂方法。
  • 看到“动态增加职责”触发装饰器。
  • 看到“算法可替换”触发策略。
  • 看到“状态变化通知多方”触发观察者。
  • 看到“父类定流程,子类补细节”触发模板方法。

归纳PDF里通常有成段描述,你需要做的是把每段压成一个不超过12个字的短语。试卷的选择题和判断题,本质上就是考你能不能完成这种反向匹配。

3. 用可复现的Java代码把设计模式变成答题模板

3.1 单例模式:双重检查锁的写法与考点

单例是Java设计模式试卷里几乎必出的一题,因为它同时考察并发、类加载和关键字理解。下面是我在考试和面试中常用的标准写法:

public class Singleton { // volatile 防止实例化时的指令重排 private static volatile Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }

这段代码的答题要点有三个。第一,构造器设为private,保证了外部无法new对象。第二,外层判断避免每次调用都加锁,内层判断防止并发下重复创建。第三,volatile关键字不是可选项,它保证instance在初始化完成前不会被其他线程读到,否则可能出现拿到半成品对象的情况。考试如果问“懒汉式和饿汉式区别”,可以补充:懒汉式在第一次调用时创建实例,内存占用更晚但要用锁;饿汉式在类加载时创建实例,写法简单但没有延迟加载效果。分析“参数”时要注意:这里没有方法参数,真正的考点是实例化时机和线程可见性。

3.2 工厂方法模式:先定义创建者接口,再交给子类

工厂方法适合回答“现有代码需要支持新类型”的题目。下面的代码结构可以直接套用:

interface Sender { void send(String message); } class EmailSender implements Sender { @Override public void send(String message) { System.out.println("邮件发送:" + message); } } class SmsSender implements Sender { @Override public void send(String message) { System.out.println("短信发送:" + message); } } interface SenderFactory { Sender createSender(); } class EmailSenderFactory implements SenderFactory { @Override public Sender createSender() { return new EmailSender(); } }

这里将创建对象的逻辑收进工厂子类,调用方只需依赖SenderFactory接口和Sender接口。新增一个微信通知时,不需要改动已有工厂,只需要新增WechatSender和对应工厂类,这完美对应开闭原则。考试画图题常要求补全这个结构:客户端、产品接口、具体产品、工厂接口、具体工厂五个角色。写代码时注意接口命名用名词,工厂类避免直接new具体产品到业务代码中,否则会退化成一个简单的工具类。

3.3 观察者模式:用接口拆分消息发布者与订阅者

观察者模式常以情景题出现,比如“订单状态变更后需要通知短信服务和邮件服务”。可复现的迷你实现如下:

import java.util.ArrayList; import java.util.List; interface OrderObserver { void update(String orderStatus); } class SmsObserver implements OrderObserver { @Override public void update(String orderStatus) { System.out.println("发送短信,当前状态:" + orderStatus); } } class OrderSubject { private final List<OrderObserver> observers = new ArrayList<>(); public void attach(OrderObserver observer) { observers.add(observer); } public void changeStatus(String status) { System.out.println("订单状态变化为:" + status); for (OrderObserver observer : observers) { observer.update(status); } } }

执行逻辑是:OrderSubject维护观察者列表,changeStatus被调用时遍历列表并通知所有人。这里的关键参数是观察者列表的增删方法,实际开发中要考虑并发修改问题,但考试只需要写出 attach、detach 和 notify 三个核心操作。理解观察者模式的中心思想:发布者不关心具体通知对象,只依赖OrderObserver接口,这样新增通知渠道不需要改动订单主体代码。这也是事件驱动系统和JMS等机制在Java层面的原始模型。

3.4 六大原则如何回答“为什么这么设计”

设计模式试题的简答题经常落在六大原则上。复习时可以把原则压缩成一张对照表,方便在代码题之后追加一段解释:

原则一句话核心代码落点
单一职责一个类只有一个变化原因避免大而全的上帝类
开闭原则对扩展开放,对修改关闭接口加实现,不入侵现有方法
里氏替换子类能替换父类且行为不变继承时不要重写父类已实现方法
依赖倒置依赖抽象而不是具体类方法参数写接口不写实现类
接口隔离客户端不需要被强迫依赖它不使用的方法细分接口,用多个小接口替代大接口
迪米特法则对象尽量少了解其他对象通过门面类间接访问,减少直接调用链

答题时可以这样组织:先写模式对应的接口和类,再写一句“这种写法符合开闭原则,因为新增类型时只需要添加新类,不需要修改原有代码”。这是试卷的标准得分句式,也是java面试八股文里的常见表达。

4. 拆解A卷题型:从选择题到代码题的答题套路

4.1 选择题:用题干关键词做第一次过滤

A卷选择题一般给一个场景,问你“应使用哪种设计模式”。我的答题顺序是三步:

  1. 圈出题干中的动词和结果词,例如“创建”“扩展”“通知”“减少依赖”。
  2. 把动词映射到上文的触发器短语。例如“动态扩展功能”对应装饰器,“算法可以互相替换”对应策略。
  3. 剩余选项如果同时包含两个相似模式,再通过类图关系区分。

举例来说,题干出现“将一个类的接口转换成客户期望的另一个接口”,直接对应适配器;如果出现“为多个子系统提供统一入口”,直接对应外观。选择题不需要写代码,关键是建立快速映射,平时复习时多刷几套设计模式笔试题,比反复看PDF原文更能形成记忆固化。

4.2 填空题和判断题:注意模式名和描述词之间的缝隙

填空题常挖这些位置:

  • 单例模式分为懒汉式和饿汉式,双重检查锁属于懒汉式。
  • 模板方法模式定义算法骨架,把可变步骤延迟到子类实现。
  • 观察者模式定义对象间一对多依赖关系。
  • 状态模式允许对象在内部状态改变时改变行为,看起来像修改了类。

判断题则喜欢偷换词语,比如“策略模式是通过继承来实现算法替换”,这就是错误表述,因为策略模式用组合而不是继承。复习时对PDF里出现过的黑体词要格外敏感,模式名必须能准确拼写,因为填空只给首字母或部分字母时,写错一个词就会丢分。

4.3 简答题和画图题:固定四段式作答

简答题可以按“意图、角色、协作、优缺点”四段式来写。以工厂方法模式为例:

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。角色:产品接口、具体产品、工厂接口、具体工厂。协作:客户端调用具体工厂方法,返回产品实例。优点:对扩展开放,符合开闭原则;缺点:每增加一个产品就要增加一个工厂类,类数量增多。

画图题需要画出类之间是空心箭头还是实心箭头,聚合还是组合。短时间内提升画图能力的方法是:把每个模式的典型类图在纸上默画三遍,第一遍对照PDF,第二遍凭记忆,第三遍标注关系名称。考试不会要求画全23种,优先练单例、工厂方法、观察者、装饰器这四张。

4.4 代码实现题:按“接口、具体类、测试调用”三段写

代码题最高频的是策略模式和观察者模式。以“支付方式可切换”为例,策略模式的标准结构是:

interface PayStrategy { void pay(double amount); } class AlipayStrategy implements PayStrategy { @Override public void pay(double amount) { System.out.println("支付宝支付:" + amount); } } class WechatPayStrategy implements PayStrategy { @Override public void pay(double amount) { System.out.println("微信支付:" + amount); } } class PaymentContext { private PayStrategy strategy; public void setStrategy(PayStrategy strategy) { this.strategy = strategy; } public void pay(double amount) { strategy.pay(amount); } }

写代码时遵循三个步骤:先写策略接口,再写多个实现类,最后用上下文类持有策略对象。上下文类的关键作用是隔离客户端与具体策略,调用方只需要调用context.pay,不需要知道当前是哪种支付方式。这段代码中setStrategy负责切换运行时的行为,所以代码题会要求在main方法中演示“先设置支付宝,再切换微信”。这种“可替换”特征就是策略模式的唯一判别标准。撰写时要保持类名和方法名一致,避免出现只定义接口而不提供实现的空壳。

5. 把试卷归纳平移成面试八股文与项目实践技巧

设计模式期末复习和java面试其实共用同一套知识骨架,差别只在于面试要求你讲“项目里怎么用”。这里有一个可操作的小技巧:把试卷里的每个模式对应到一个实际场景,并准备一段不超过60秒的陈述。比如你在项目里用Spring AOP记录日志,本质上依赖的是JDK动态Proxy机制,那就可以这样组织答案:“项目中有多个业务方法需要日志和耗时统计,我通过动态Proxy生成一个拦截器,在invoke方法里统一打印入参和返回值。”这段话同时覆盖了Proxy模式、AOP概念和你的动手能力。

另一个实用技巧是把代码模板保存为本地速记文件,用命令行随手编译运行。下面是一段验证观察者模式的示例命令序列:

mkdir -p design-pattern-demo # 将 OrderSubject 和 OrderObserver 保存到该目录 javac design-pattern-demo/*.java java -cp design-pattern-demo com.example.OrderSubjectDemo

javac的作用是检查代码结构是否完整,能够编译通过说明类名、接口实现和访问修饰符没有低级错误。运行命令时需要在测试类main方法中先attach观察者,再调用changeStatus,否则不会看到任何通知输出。建议把每个高频模式都写成这样一个可运行的独立demo,因为考试代码题的核心能力就是“在空白处补全类声明和方法体”,而这只有通过动手编译才能内化。

面试时还要注意区分模式和原则。设计模式是具体实现模板,六大原则是更高层的指导准则。别人问“你为什么用策略模式”,你回答“支付场景有多种算法且需要运行时切换,策略模式让算法独立于客户端变化”,这句话就是试卷简答题和面试官的共同标准答案。把这些验证过的代码和话术作为你的复习底稿,期末试题就不再只是一份PDF,而是你进入java后端成长路线的实战起点。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 18:46:32

RuoYi AI 多模型接入不想逐个填 Key?TaoToken 这样改模型 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:44:47

区块链如何重塑工程监理:从联盟链存证到智能合约的可信闭环

简介&#xff1a;雄安集团区块链监理管理系统是一份面向工程建设监管数字化转型的解决方案&#xff0c;以区块链、大数据、云平台为底座&#xff0c;聚焦集团-公司-项目三级管理架构下的人员履约、质量验收、现场巡查、信用考核等核心业务&#xff0c;解决传统监理中责任落实难…

作者头像 李华
网站建设 2026/9/18 18:44:03

用Python正则与Base58Check校验提取比特币地址

最近在帮朋友整理一批链上转账记录&#xff0c;遇到了一个特别典型的活儿&#xff1a;从一堆混乱文本里把比特币地址精确地捞出来。源数据有网页抓来的、有聊天记录导出的、还有PDF转出来的纯文本&#xff0c;格式乱得让人头大。折腾下来我发现&#xff0c;用Python正则表达式做…

作者头像 李华
网站建设 2026/9/18 18:43:49

Bulk RNA-seq全流程指南:从测序数据到差异表达可视化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华