01-2023年上半年软件设计师考试java真题解析
1.真题内容
在某系统中,类 Interval(间隔) 代表由下界(lower bound(边界))上界(upper bound )定义的区间。
要求采用不同的格式显示区间范围。
如[lower bound , upper bound ]、[ lower bound … upper bound ]、[ lower bou nd - upper bound ]等。
现采用策略(strategy)模式实现该要求,得到如图5-1所示的类图。
2.策略模式(strategy) 191页
策略模式(strategy):定义一系列算法,把它们一个个封装起来,并且使它们之间可以互相替换,从而让算法可以独立于使用它的用户而编号。
3.类图关系 167页
4.真题代码
import java.util.*;
enum TYPE { COMMA, DOTS, LINE };
interface PrintStrategy{ public (1) ;
}class Interval {private double lowerBound; private double upperBound; public Interval(double p_lower, double p_upper){lowerBound = p_lower; upperBound = p_upper;}public void printInterval(PrintStrategy ptr) {(2);} public double getLower() { return lowerBound; }public double getUpper() { return upperBound; }
}class PrintIntervalsComma implements PrintStrategy{ public void doPrint(Interval val){System.out.println("[ " + val.getLower() + "," + val.getUpper()+"]");}
}
class PrintIntervalsDots implements PrintStrategy {public void doPrint(Interval val) {System.out.println("[" + val.getLower() + "..." + val.getUpper() + "]"); }
}
class PrintIntervalsLine implements PrintStrategy {public void doPrint(Interval val) {System.out.println("[" + val.getLower() + "-" + val.getUpper() + "]");}
}class Strategy {
public static PrintStrategy getStrategy(TYPE type) {PrintStrategy st = null;switch (type) {case COMMA: (3) break;case DOTS:(4)break;case LINE:(5)break;}return st;}
}public static void main(String[] args) {Interval a = new Interval(1.7, 2.1);a.printInterval(getStrategy(TYPE.COMMA));a.printInterval(getStrategy(TYPE.DOTS));a.printInterval(getStrategy(TYPE.LINE)); }
}
5.题目解析
由图可知,PrintStrategy(打印策略)父类,它有3个子类。
分别为PrintIntervalsComma(打印间隔逗号)、PrintIntervalsDots(打印间隔点)、PrintIntervalsLine(打印间隔线)。
通过实心的菱形箭头判断,Interval(间隔)和PrintStrategy(打印策略)有一个1对多的关系。
推测,Interval(整体)里可能会有PrintStrategy(部分)。
观察代码:
enum TYPE { COMMA, DOTS, LINE }定义了一个枚举,枚举通常是常量。
PrintStrategy父接口缺失一个方法。
父接口中缺失的方法去它的子类中寻找。
在Comma中找到public void doPrint(Interval val)方法。
3个子类都有这个方法。
因此(1)void doPrint(Interval val)
Interval类中有一个public void printInterval方法,该方法传入了一个PrintStrategy对象ptr。
那第2空就是要调ptr做事情,ptr是PrintStrategy的对象,PrintStrategy只有一个方法doPrint。
doPrint方法需要传入Interval参数,现在就在Interval中,因此用this。
(2)ptr.doPrint(this)
用父接口PrintStrategy定义了一个变量st。
父接口定义的变量肯定是要去接子对象的。
这里是null,表示一会肯定有一个意义的参数要传进来。
如果type传进来的是COMMA,则把COMMA这个儿子传给父接口st。
6.代码解析
import java.util.*;
# import 是关键字,用于导入包或类。
# java.util 是包的名称,表示我们要导入的是 java.util包。
# * 是一个通配符,表示导入该包中的所有类。enum TYPE { COMMA, DOTS, LINE };
# enum(枚举)是一种特殊的类,用于表示一组固定的常量值
# 三个枚举常量:COMMA(逗号)、DOTS(点)、LINE(线)interface PrintStrategy{
# interface: 关键字,用于定义一个接口。
# PrintStrategyt(打印策略): 接口名。 public void doPrint(Interval val); // (1) 添加方法声明 答案在实现接口中找 # 父接口PrintStrategy中缺失的方法去它的子类中寻找。# 去class PrintIntervalsComma implements PrintStrateg找方法# 子类中只有public void doPrint(Interval val)1个方法# 因此(1)void doPrint(Interval val)# public: 这是一个访问修饰符,表示这个方法可以被任何其他类访问。# 因为interface里面的方法默认是public abstract的,因此这里public也可以省略, # void:返回类型为,表示不返回任何值。# Interval:参数类型# val:参数名# 该方法接受一个名为 val(单位)的Interval(间隔)类型的参数
}class Interval {
# Interval:类名 private double lowerBound; private double upperBound; # 声明了一个名为 lowerBound 的私有成员变量。 # private:访问修饰符,表示这个变量只能在它所在的类内部访问。# 当一个类成员被声明为private时,外部类和对象无法直接访问或修改这个变量。# double是一种基本数据类型,用于表示双精度浮点数。# lowerBound(下边界) upperBound(上边界) 是私有实例变量。# lowerBound下界 upperBound上界public Interval(double p_lower, double p_upper){lowerBound = p_lower; upperBound = p_upper;}# 定义了一个构造函数,用于初始化 Interval 类的实例。# 构造函数语法示例:第一行class Person 第二行 public Person(String name) {this.name = name;}# 构造函数是一种特殊的方法,它的名字与类名相同,并且没有返回类型。# 这个构造函数允许在创建 Interval 类的实例时,通过参数直接设置 lowerBound 和 upperBound 的初始值。# 这个构造函数接收两个双精度浮点数 p_lower 和 p_upper,然后将它们分别赋值给类的成员变量 lowerBound 和 upperBound# Interval:构造函数# double p_lower, double p_upper参数列表# lowerBound、upperBound类的实例变量# p_lower、p_upper传入的参数public void printInterval(PrintStrategy ptr){ptr.doPrint(this);} // (2) 调用doPrint方法并传递当前对象# 定义一个名为 printInterval的方法,该方法接受一个PrintStrategy类型的参数ptr。# 调用该参数的 doPrint 方法,将当前对象(即 this)作为参数传递给 doPrint 方法。# printInterval方法传入了一个ptr对象,后面通常就要去调ptr的方法。# 去PrintStrategy中寻找,它只有一个方法doPrint。# doPrint需要传入Interval类型的参数。 # this 关键字引用的是当前对象,因为代码就在Interval类里。# 注意Interval val是定义的时候设置的形参,实际调用的时候用具体的数据传进去。# 当doPrint方法需要访问当前 Interval 对象的数据,可以使用this。# printInterval:方法名# PrintStrategy:参数类型# ptr:对象名# doPrint:方法名public double getLower() { return lowerBound; }public double getUpper() { return upperBound; }# public:表示该方法可以被任何其他类访问# double:这方法的返回类型,表示该方法将返回一个双精度浮点数(double)# getLower:方法的名。根据命名约定,方法名通常以小写字母开头,并使用驼峰命名法(camelCase)# 在这个例子中,getLower 暗示了这个方法的作用是获取某个值的下限(lower bound)# ():圆括号内可以包含参数列表。圆括号是空的,表示这个方法不接受任何参数# 花括号 {} 包围的方法体,包含了方法的具体实现# return lowerBound; 是方法体中的一条语句,表示返回一个名为 lowerBound 的变量的值。# 这个变量应该是在类的其他地方定义的一个成员变量
}class PrintIntervalsComma implements PrintStrategy{
# 具体的实现类
# PrintIntervalsComma:类的名称。
# implements:表示一个类实现了某个接口。接口定义了一组方法,这些方法必须在实现该接口的类中被实现。
# PrintStrategy:这是接口的名称。接口是一种抽象类型,定义了一组方法,但不提供其具体实现。public void doPrint(Interval val){System.out.println("[ " + val.getLower() + "," + val.getUpper()+"]");}
}
# doPrint:方法名。在这个例子中,doPrint 暗示这个方法的作用是执行打印操作。
# Interval:参数类型。
# val:参数名。
# doPrint方法接受一个名为 val 的参数,其类型是 Interval。# System.out.println 是一个标准输出方法,用于将文本输出到控制台。
# "[ " + val.getLower() + "," + val.getUpper()+"]" 是拼接字符串,表示要输出的内容。
# val.getLower() 调用 val 对象的 getLower 方法,获取区间的下界。class PrintIntervalsDots implements PrintStrategy {public void doPrint(Interval val) {System.out.println("[" + val.getLower() + "..." + val.getUpper() + "]"); }
}
class PrintIntervalsLine implements PrintStrategy {public void doPrint(Interval val) {System.out.println("[" + val.getLower() + "-" + val.getUpper() + "]");}
}class Strategy {public static PrintStrategy getStrategy(TYPE type) {# getStrategy方法接受一个TYPE枚举值作为参数,并根据这个值返回相应的PrintStrategy实现类。# static:关键字,表示该方法属于类本身,而不是类的实例。静态方法可以直接通过类名调用,而不需要创建类的实例。# 如果PrintStrategy是一个工具类,你可以直接使用PrintStrategy getStrategy(type)来获取策略。# 而不需要先创建一个PrintStrategy对象。# PrintStrategy:这是方法的返回类型,表示该方法将返回一个 PrintStrategy类型的对象。# getStrategy:方法名。在这个例子中,getStrategy 表示这个方法的作用是根据传入的类型获取相应的打印策略。# TYPE:参数类型# type:参数名PrintStrategy st = null;# 声明并初始化一个名为 st 的变量。# PrintStrategy:类型声明。# PrintStrategy 是一个类或接口的名称,它表示变量 st 的类型。# 在 Java 中,类型可以是基本数据类型(如 int, double),也可以是用户定义的类或接口。# st 是变量的名称# null 是变量 st 的初始值。null 是一个特殊的字面量,表示对象引用不指向任何对象。switch (type) {# switch :控制流语句,根据变量的值执行不同的代码块。# 在这里,它基于 type 的值选择不同的分支。case COMMA: # case 关键字用于定义 switch 语句的一个分支。# 如果 type 的值是 COMMA,则执行该分支内的代码。st = new PrintIntervalsComma(); // (3) 实例化正确的类#如果 type 的值是 COMMA,则实例化一个 PrintIntervalsComma 对象,并将其赋值给 st 变量。# st是PrintStrategy类型的# PrintIntervalsComma是一个实现了 PrintStrategy接口的类# 推测(3)是要创建一个具体的实例化对象break;# break 语句用于终止当前的 case 分支,防止继续执行后续的 case 分支。 case DOTS:st = new PrintIntervalsDots(); // (4) 实例化正确的类break;case LINE:st = new PrintIntervalsLine(); // (5) 实例化正确的类break;}return st;}
}public static void main(String[] args) {
# 程序入口点Interval a = new Interval(1.7, 2.1);# 声明一个名为a的变量,其类型为 Interval。# 使用 new 关键字调用Interval类的构造函数,并传递两个参数 1.7和2.1。# 将创建的 Interval对象赋值给变量a。 a.printInterval(getStrategy(TYPE.COMMA));a.printInterval(getStrategy(TYPE.DOTS));a.printInterval(getStrategy(TYPE.LINE)); # 调用 a 对象的 printInterval 方法。# 将 getStrategy(TYPE.LINE) 的返回值作为参数传递给 printInterval 方法。# a:变量名# printInterval:方法名,用于打印区间信息。# getStrategy(TYPE.LINE)方法调用,调用 getStrategy方法,并传递 TYPE.LINE 作为参数。# 这个方法返回一个实现了某个策略接口或抽象类的实例。# TYPE.LINE: 枚举常量}
}
相关文章:

01-2023年上半年软件设计师考试java真题解析
1.真题内容 在某系统中,类 Interval(间隔) 代表由下界(lower bound(边界))上界(upper bound )定义的区间。 要求采用不同的格式显示区间范围。 如[lower bound , upper bound ]、[ lower bound … upper bound ]、[ lower bou nd - upper bound &#x…...
一文讲清楚CSS3新特性
文章目录 一文讲清楚CSS3新特性1. 新增选择器特性2. 新增的样式3. 新增布局方式 一文讲清楚CSS3新特性 1. 新增选择器特性 层次选择器(div~p)选择前面有div的p元素伪类选择器 :first-of-type 表示⼀组同级元素中其类型的第⼀个元素:last-of-type 表示⼀组同级元素中其类型的最…...

系统设计案例:设计 Spotify
https://levelup.gitconnected.com/system-design-interview-question-design-spotify-4a8a79697dda 这是一道系统设计面试题,即设计 Spotify。在真正的面试中,你通常会关注应用程序的一两个主要功能,但在本文中,我想从高层次概述…...

太速科技-633-4通道2Gsps 14bit AD采集PCie卡
4通道2Gsps 14bit AD采集PCie卡 一、板卡概述 二、性能指标 板卡功能 参数 内容 ADC 芯片型号 AD9689 路数 4路ADC, 采样率 2Gsps 数据位 14bit 数字接口 JESD204B 模拟接口 交流耦合 模拟输入 1V 连接器 6路 SMA 输入阻抗 50Ω 模拟指…...

图片叠加拖拽对比展示效果实现——Vue版
图片叠加拖拽对比展示效果实现——Vue版 项目中遇见一个需求:2张图片按竖线分割,左右两侧分别展示对应图片,通过滚动条拖动对应展示图片区域;; 网上搜索了下,没有找到直接可用的组件,这里自己封装了一个次功…...

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中的应用前景
结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。如有滤波、导航方面的代码定制需求,可通过文末卡片联系作者获得帮助 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状MATLAB代码示例结论结合LSTM和…...

【MATLAB APP Designer】小波阈值去噪(第一期)
代码原理及流程 小波阈值去噪是一种信号处理方法,用于从信号中去除噪声。这种方法基于小波变换,它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤: (1)小波变换:首先对含噪信…...

ClickHouse副本搭建
一. 副本概述 副本的目的主要是保障数据的高可用性,ClickHouse中的副本没有主从之分。所有的副本都是平等的。 副本写入流程: 二. 副本搭建 1. 实验环境 hadoop1(192.168.47.128) hadoop2(192.168.47.129)2. 修改配置文件 修改两台主机/etc/click…...

K3知识点
提示:文章 文章目录 前言一、顺序队列和链式队列题目 顺序队列和链式队列的定义和特性实际应用场景顺序表题目 链式队列 二、AVL树三、红黑树四、二叉排序树五、树的概念题目1左子树右子树前序遍历、中序遍历,后序遍历先根遍历、中根遍历左孩子右孩子题目…...

cocos creator 3.x版本如何添加打开游戏时首屏加载进度条
前言 项目有一个打开游戏时添加载入进度条的需求。这个功能2.X版本是自带的,不知为何在3.X版本中移除了。 实现 先说一下解决思路,就是在引擎源码加载场景的位置插入一个方法,然后在游戏入口HTML处监听即可。 1.找到对应源码脚本 在coco…...
Fama MacBeth两步法与多因子模型的回归检验
Fama MacBeth两步法与多因子模型的回归检验 – 潘登同学的因子投资笔记 本文观点来自最近学习的石川老师《因子投资:方法与实践》一书 文章目录 Fama MacBeth两步法与多因子模型的回归检验 -- 潘登同学的因子投资笔记 多因子回归检验时序回归检验截面回归检验Fama–…...

IDEA 搭建 SpringBoot 项目之配置 Maven
目录 1?配置 Maven 1.1?打开 settings.xml 文件1.2?配置本地仓库路径1.3?配置中央仓库路径1.4?配置 JDK 版本1.5?重新下载项目依赖 2?配置 idea 2.1?在启动页打开设置2.2?配置 Java Compiler2.3?配置 File Encodings2.4?配置 Maven2.5?配置 Auto Import2.6?配置 C…...

node.js之---事件循环机制
事件循环机制 Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…...

Python OpenAI 库开发指南:从入门到实战精通
在人工智能(AI)领域,OpenAI无疑是全球最受瞩目的机构之一。它推出的GPT系列模型、DALLE等创新技术,正在深刻改变各行各业。作为Python开发者,我们该如何快速上手并高效利用OpenAI的API,成为了提升个人竞争力…...

flash-attention保姆级安装教程
FlashAttention安装教程 FlashAttention 是一种高效且内存优化的注意力机制实现,旨在提升大规模深度学习模型的训练和推理效率。 高效计算:通过优化 IO 操作,减少内存访问开销,提升计算效率。 内存优化:降低内存占用…...
送给一年编程道路的自己
回望过去一年在编程道路上的成长与收获,是一个很有意义的过程。总结自己这一年的编程经历,不仅可以帮助你更清晰地了解自己的进步和不足,还能为未来的发展指引方向。以下是一些可能的收获,供你参考: 1. 技能提升 语言…...

LeRobot(1)
Train python lerobot/scripts/train.py \ policyact \ envaloha \ env.taskAlohaInsertion-v0 \ dataset_repo_idlerobot/aloha_sim_insertion_human \ load_data一直报错,忘记截图了,反正是ssh报错,下不下来,网…...
C++ 设计模式:组合模式(Composite Pattern)
链接:C 设计模式 链接:C 设计模式 - 迭代器模式 链接:C 设计模式 - 职责链模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式…...

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示
本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。 编译源码…...

强化学习(1)
Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标:最大化总…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...