尧图精选

软考软件设计师下午题六:Java设计模式填空套路与高分实务

🕒 发布时间:2026/9/13 3:02:53 📁 来源:尧图网络
想拿下软考软件设计师的下午题第六题Java设计模式基本上是一道绕不开的“标准题”。我自己备考那会儿很多人前面的选择题刷得飞起一到下午题就卡壳尤其是最后一题代码填空看着眼熟但真要动手填又拿不准该填接口还是抽象类、该写extends还是implements、方法返回值到底是谁。这篇文章就把下午题六的考查逻辑、高频设计模式的识别方法、答题套路和实战细节一次性理清楚适合正在冲刺软考中级软件设计师的考生也适合想通过真题倒推设计模式用法的Java开发者和刚接触设计模式的学生。1. 下午题六到底考什么——先看清这道题的出题逻辑1.1 从近十年的真题看考查形式软件设计师下午题一共六道大题前四道是必做的数据流图、数据库设计、UML建模、算法题第五道是Java和C二选一第六道同样是Java和C二选一。下午题六全称是“Java设计模式题”但严格来说它考的并不只是设计模式本身而是“用Java代码实现一个完整的应用场景”这个场景会套用一到两个设计模式。这几年的真题反复出现几类命题素材影音播放器、文件管理系统、数据库连接、日志记录、图形绘制、订单处理、消息通知。场景五花八门但套路非常固定题目会给出完整的系统描述和需求说明然后贴出一段不完整的Java代码留出4到6个空位有时还会先给出类图让你根据类图补全代码最后一问通常是简答题比如“说明使用了什么设计模式”“这样设计有什么好处”1.2 判分标准里暗藏的得分逻辑下午题六的分值一般是15分其中代码填空占了绝大部分。别看它只是填空实际上每一个空都有明确的得分点不是写了就有分而是要写到关键点上。举个例子如果一个空要求填类的继承关系你需要写的是extends加父类名而不是光写一个类名如果一个空要求实现接口方法你写的访问修饰符、返回值类型、参数列表都必须和接口定义完全一致多一个参数少一个参数都会丢分。从阅卷角度看主观题部分会看关键词但代码填空更接近客观题答错基本拿不到分。这就引出一个很重要的备考结论下午题六的备考重心应该是大量看真题、练真题而不是自己去写一堆设计模式的完整实现。因为考试那种“挖空式”的考法本质上在测试你能不能在一个已有的代码框架里根据上下文把缺失的拼图补上。你不仅要懂设计模式还要懂Java本身。1.3 为什么偏偏选Java考设计模式软考下午题五六的S选语言是Java和C绝大多数考生会选Java。原因很现实Java的面向对象特征非常纯粹接口、抽象类、多态、泛型这些机制用来展示设计模式几乎是量身定做。很多设计模式的经典示例代码就是Java写的。另外Java生态里Spring、MyBatis这些框架大量使用了设计模式出题人很容易从真实框架中抽取简化场景来命题。比如Spring里的BeanFactory就是典型的工厂模式事件监听机制就是观察者模式AOP的动态代理和代理模式直接相关。所以准备这道题其实是在为后续Java开发面试打底子软考证书考完以后这些内容在面试中一样能用上。2. 做对下午题六必须先掌握的Java语言地基2.1 没有UML基础看懂类图是关键下午题六经常给出一张类图要求你根据类图补全Java代码。很多考生看到类图就头大其实软考考到的类图关系非常有限核心就四种继承、实现、关联、依赖。继承在类图中是带空心三角形的实线箭头对应Java里的extends关键字用于类与类之间、抽象类与类之间。实现是带空心三角形的虚线箭头对应Java里的implements关键字用于类实现接口。关联关系分为聚合和组合在Java代码里通常体现在成员变量的类型上。比如一个播放器类里有一个歌曲列表代码里就会体现为一个ListSong成员变量而不会在类图上单独画一个数据结构。我建议备考时不用系统去学UML只需要把类图的几种箭头和Java语法的对应关系背熟。最简单的验证方法拿到一张类图先把类名、接口名、方法名抄出来再对照代码填空你会发现填空的位置基本都是类图中已经标注好的类或方法来补充。2.2 接口、抽象类和多态的实战区分下午题六的填空出现频率最高的考点就是“这里该填接口还是抽象类”。我见过太多考生在这上面翻车所以单独拿出来说。接口和抽象类都能定义抽象方法但语义上差别很大。接口强调的是“能力”表示这个类能做什么抽象类强调的是“共性”表示这些类从哪来的、有什么共同特征。考试的时候如果题目说系统中的多个类需要统一调用某个方法那大概率用接口如果题目说多种对象有公共的属性和行为并且某些行为要延迟到子类实现那用抽象类。举个例子策略模式里通常定义一个策略接口因为各种策略之间没有公共属性只需要约定一个方法而模板方法模式里定义的是抽象类因为算法的骨架是公共的只有部分步骤延迟到子类实现。多态是另一个高频考点。填空的时候如果某个方法需要接收不同类型的产品对象而代码里写的是父类或接口类型的参数那本质就是在利用多态。答题时一定要看清楚方法的形参类型是接口还是具体类、返回值类型是基类还是子类这决定了你填的代码能不能编译通过。2.3 Java写设计模式的几个固定句式想在填空题上拿分光看是不够的得记一些固定的写作模式。这些模式在历年真题里反复出现背下来以后考试速度能快很多。声明接口就是interface 名称 { 方法签名; }声明抽象类是abstract class 名称 { 抽象方法; 具体方法; }子类继承抽象类是class 子类 extends 父类 { ... }类实现接口是class 类 implements 接口 { ... }。几乎每一年的下午题六都会出现这些句式。还有一个隐藏考点是方法的重写规则。Java中子类重写父类方法时访问权限不能更低返回值类型可以相同也可以是父类返回类型的子类型参数列表必须完全相同。填空题里常有一个空要求你写方法的完整签名比如public void display()如果你漏了public编译就不通过即使你方法名和参数都对阅卷也不会给分。3. 高频设计模式速解套路——下午题六最常出现的几个模式3.1 工厂三兄弟简单工厂、工厂方法、抽象工厂工厂模式基本是下午题六的“题库常客”。每几年就会考一次跟工厂相关的题目有时直接考创建型模式有时融合在其他模式里。简单工厂模式是最容易考的。它的核心是有一个工厂类根据传入的参数决定创建哪一种产品对象。代码里通常长这样return 产品类型 switch(参数) { ... }这个switch或者if-else就是考点填空时往往让你填各个case分支里要new哪个具体类。工厂方法模式比简单工厂多了一层抽象。它把创建对象的职责下沉到子类工厂父类只定义创建对象的抽象方法具体实例化延迟到子类。考试时常见的设计是抽象工厂类里有一个抽象方法createProduct()不同子类工厂里各自new不同的产品。抽象工厂模式强调的是一组相关的产品。比如一个UI系统里有按钮、输入框每种风格都要有对应的按钮和输入框那就用抽象工厂。答题时如果发现代码里有多个产品接口而且工厂接口里定义了不止一个创建方法那基本就是抽象工厂了。3.2 单例模式的双重校验锁单例模式在Java题里出现的频率很高尤其是饿汉式和双重校验锁这两种写法。考试有时候会直接给你一段残缺的单例代码让你补全构造函数和获取实例的方法。饿汉式的写法是类加载时就创建实例代码通常是private static final 类名 instance new 类名();然后构造函数私有化提供一个静态的getInstance方法。这种方式简单但类加载就创建了对象如果对象一直没用上就浪费内存了。懒汉式配合双重校验锁是更进阶的写法代码里会有一个volatile修饰的静态成员变量getInstance方法里先做一次非空判断再加锁锁内再做一次非空判断。很多考生会漏掉第二个判断或者漏掉volatile补全填空的时候要注意看题目上下文是否暗示了这些细节。考试里单例模式经常不是主角而是作为辅助模式出现比如日志器、配置管理器、连接池里的某个类被声明为单例。识别信号就是类的构造函数被私有化且提供一个getInstance方法。3.3 观察者模式的通知机制观察者模式在下午题六里出现的频率相当高尤其是“消息通知”“事件公告”“股市行情”“气象站”这类场景。它的核心是一对多的依赖关系被观察者状态变化时自动通知所有注册的观察者。Java语言本身提供过Observer和Observable两个类但随着Java 9把这两个类标记为废弃后续考试里更多是让大家自己实现观察者模式的接口。答题时常见的填空位置是观察者接口里定义update()方法被观察者里有一个ListObserver集合以及attach()、detach()、notifyObservers()这几个方法的实现。被观察者里这个List是核心很多考生想不到。你要知道观察者模式里被观察者必须保存所有观察者的引用否则没法通知。填空的时候如果出现了遍历集合并调用每个元素的update方法那就是notify方法没跑了。3.4 策略模式与模板方法算法的封装策略模式和模板方法模式都跟算法有关但思路正好相反。策略模式是把算法族封装起来让它们可以互相替换模板方法模式是把算法的骨架定好把一些具体步骤延迟到子类实现。策略模式的识别信号非常明显有一个策略接口接口里定义了一个算法方法然后有多个策略类实现这个接口还有一个上下文类持有策略接口的引用。上下文类会在运行时候切换策略切换的方式通常是setter方法。下午题里经常让它跟简单工厂模式结合考工厂负责创建具体的策略对象上下文负责调用策略。模板方法模式的识别信号是抽象父类里有一个非抽象的方法方法里调用了若干个可能被子类重写的步骤方法。最高频的考点是让你补全抽象父类里这个模板方法的调用顺序或者让你补全抽象步骤方法的定义。3.5 组合模式与装饰器树状结构和功能扩展组合模式适合处理树状的“部分-整体”关系比如文件系统、公司组织架构、菜单结构。它让客户端可以一致地对待单个对象和组合对象。代码上抽象构件类定义公共方法叶子构件和容器构件都继承这个抽象类容器构件内部维护一个子构件集合。下午题里经常考“菜单”“文件目录”这类场景填空位置常出现在容器构件的那个子构件集合声明上。装饰器模式适合给对象动态添加功能它和继承的区别在于装饰器是基于组合而非继承来扩展功能的。代码结构上装饰器类和被装饰类实现同一个接口装饰器内部持有被装饰对象的引用。答题时如果类图里出现一个和原类实现相同接口的类而且这个类里还有一个同类型成员变量那基本就是装饰器。装饰器和策略模式容易搞混因为它俩代码结构上都像“持有另一个类的引用”。区分的关键是意图如果引用的对象用于替代原有实现那是策略如果用于增强原有实现在原有基础上附加行为那是装饰器。考试题干里通常会有明确提示比如“在不修改原有类的情况下动态增加功能”。4. 真题实战从读题到拿分的一次完整走通4.1 读题三件事十分钟内锁定模式与答案位置很多考生下午题六栽在时间不够上。按考试时间推算最后这题留给你的时间其实不多建议控制在25分钟以内。读题阶段重点做三件事。第一件事把题干的场景描述过一遍圈出关键词。看到“创建”“根据类型生成”“工厂”这些词往工厂模式考虑看到“通知”“订阅”“监听”这些词往观察者模式考虑看到“动态扩展”“增强”“附加”这些词往装饰器模式考虑。关键词不能百分百确定模式但能大幅缩小范围。第二件事跳过描述直接看代码结构。先把代码里所有类的名字扫一遍如果出现Factory、Product、Observer、Subject、Strategy、Decorator这些英文名那设计模式基本就锁定了。软考英语词汇量不大但这些模式对应的英文名你得熟因为很多题目直接用英文类名。第三件事对照类图把缺失的类名和方法名先在草稿纸上列出来再去代码里找对应的空。类图上的类名基本就是你要填的答案类图上的方法名基本就是代码空位里要出现的方法名。这一步做完至少一半的填空已经有眉目了。4.2 代码填空的实战演示以一道工厂模式考题为例我拿一道非常典型的工厂模式题来做完整演示帮助你理解答题的节奏。题目场景大概是一个日志系统需要支持文件日志和数据库日志两种方式客户端通过一个工厂类来获取具体的日志记录器。代码里给出了一段不完整的Java实现类图中标明了Logger接口、FileLogger类、DatabaseLogger类、LoggerFactory类。第一空通常让你补Logger接口的定义答案就是interface Logger { void writeLog(); }。这一空基本送分只要记得接口里的方法默认是public abstract的就行。第二空和第三空让你补FileLogger和DatabaseLogger的实现格式就是class FileLogger implements Logger { public void writeLog() { ... } }。这里的考点是implements不能写成extends因为Logger是接口不是类两码事。第四空是核心空让你补工厂类的createLogger()方法。题目通常会给出参数根据参数判断创建哪种日志对象所以答案就是if (type.equals(file)) return new FileLogger(); else return new DatabaseLogger();。这里有个细节要注意有多种写法有些考生写成String type直接file比较字符串对象用比较不对要用equals方法这种细节错得很冤。第五空有时候让你补main方法里的调用语句。既然工厂类返回的是Logger接口类型那么调用代码大概率是Logger logger factory.createLogger(file); logger.writeLog();。这里的考点是多态你用接口类型去接收工厂返回的对象而不是用具体类去接收。如果你从头到尾能把每个类对应的职责想清楚这五个空基本都能写对。核心方法是第一确定每个类的角色第二确定角色之间的关系第三把关系用Java语法表达出来。4.3 那些容易丢分的细节下午题六丢分的原因很多不在设计模式本身而在Java语法细节和答题习惯上。第一个高频丢分点是漏写访问修饰符。接口里的方法可以省略public但实现类的重写方法必须写public不写就是包访问权限编译不通过。考场上一紧张容易漏建议拿到题目以后先看空前的代码有没有访问修饰符没有就补上。第二个高频丢分点是泛型声明的缺失。代码里如果要定义一个只能保存某类型对象的集合比如ListObserver很多考生只写List不写泛型参数。软考阅卷时如果题目要求了泛型而你没写通常不给分。第三个高频丢分点是简答题的表述。最后一问如果是“该设计有什么好处”千万别只写一句“提高了代码复用”。阅卷是按点给分的你要分点写比如“增加新的产品类型时只需要增加新的类符合开闭原则”“客户端面向接口编程降低耦合”“工厂类集中管理对象的创建便于统一维护”。多写几个点踩中得分点的概率就更大。第四个经常被忽略的问题是代码风格。下午题六的填空不是让你从零写一个类而是往题目给定的框架里填东西。所以格式要和上下文保持一致题目方法名用了createLogger就不要写成createLog题目里变量名叫logger就不要另起一个名字。这些细节做对了即使实现思路跟标准答案有点偏差阅卷时也更容易被认定为等价写法。5. 常见问题与避坑清单——考前必看的实操经验5.1 常见问题速查出现这些情况直接对号入座我把历年考生容易卡壳的问题整理成了一张速查表备考时可以拿来自测。问题现象可能原因处理建议代码里出现了switch但不知道选哪种产品简单工厂模式考法看switch的分支数量每个case对应一个具体产品类case里填new对应的产品类题目给出了多个产品接口工厂里也有多个创建方法抽象工厂模式每个创建方法对应一个产品接口返回对应产品的具体实现代码里有一个私有构造函数单例模式补全静态实例变量和静态getInstance方法注意volatile和双重判断代码里出现了一个集合用来存储多个元素观察者模式或组合模式观察者存的是观察者对象组合模式存的是子构件看集合元素的类型一个类内部持有同接口类型的成员变量策略模式或装饰器模式看代码是否调用该成员的方法以实现算法替换还是包装后增强功能抽象父类里有一个方法调用了其他抽象方法模板方法模式把这个非抽象方法补全为调用各步骤方法的模板方法子类里重写各步骤方法这张表只是帮助快速定位模式实际做题时还是要结合题干描述来综合判断。千万别看到私有构造函数就直接填单例万一这个类是工厂类也有可能是工厂模式里的某个辅助类。5.2 我踩过的坑都是教训我第一次做下午题六的时候栽在最简单的地方把implements和extends搞混了。当时代码里明明是一个接口我脑子一热就写了extends后面所有基于这个类的方法定义全跟着错。这个坑现在看起来低级但考场上真的很多人会犯尤其是程序没跑过、纯靠眼睛检查的时候。还有个坑是观察者模式里的notifyObservers()方法。我一开始以为只需要遍历观察者列表然后调用update()就行但真题里经常会在update()的参数上做文章。有的题目里观察者的update方法不带参数数据通过被观察者对象本身获取有的题目里update方法要接收一个Object参数。填空的时候一定要看接口定义不要自己想当然。最后一个小建议下午题六的代码虽然不用完整运行但强烈建议你在复习阶段把近五年的真题代码亲手敲一遍用JDK编译运行。为什么因为很多语法错误光靠肉眼看不出来比如缺少返回语句、方法重写的权限修饰符不对、泛型不一致。真正编译一次错误就全部暴露了。我复习时每天敲一道题敲完再对照标准答案一个月后下午题六基本稳定在12分以上。5.3 备考时间不够的急救策略如果你是考前一周才开始关注下午题六不要慌这里有一套急救打法。第一天把工厂方法模式、观察者模式、策略模式、模板方法这四类高频模式的代码结构各背一遍背到能默写核心框架。第二天到第五天每天做两道历年真题的下午题六做完立刻对着答案复盘重点看填空位置和你的答案差在哪。第六天总结所有真题里出现过的填空类型把接口定义、继承实现、方法补全、对象创建这几类考点各归纳出固定写法。第七天把错题重新做一遍至此你已经比大多数人准备得充分了。这套打法的逻辑是下午题六的考点高度重复与其贪多嚼不烂地背十几种设计模式不如先把最高频的那几种模式练到形成肌肉记忆。等到考场上看到类名里的Factory、Observer、Strategy你就能条件反射地写出对应的Java代码结构。结尾每年软考成绩出来以后都有很多人说自己挂在下午题上而下午题里最让人惋惜的丢分点就是在Java设计模式这道题上。实际上这道题是下午卷里性价比最高的题目之一因为它的套路最固定、模式识别方法最明确、短期突破效果也最好。备考时多花时间做真题吃透每一处的语法细节比漫无目的地刷设计模式教程有用得多。特别是最后这几天的冲刺阶段别贪全把高频模式练熟把容易错的语法点记住考试的时候就能稳稳地把分拿住。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →