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 目标:最大化总…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...