单部电梯调度程序-作业总结

news/2025/11/21 16:57:41/文章来源:https://www.cnblogs.com/work-summarize/p/19231686

1. 前言

三次单部电梯程序题目的总体分析

三次题目集围绕电梯调度程序展开迭代设计,核心知识点聚焦于面向对象设计原则(尤其是单一职责原则),队列管理,状态与行为控制及输入处理。需求逐步深化,难度呈递增趋势:题目集01是基础,只需设计单一电梯类实现核心调度逻辑,处理基本请求与输出;题目集02增加类的拆分,须遵循SRP,新增请求过滤(无效请求,重复请求),类间协作难度提升;题目集03进一步调整类结构(取消请求类,新增乘客类),修改外部请求逻辑(源楼层与目的楼层关联),需重新设计数据流转,对类职责划分和调度逻辑连贯性要求更高。

题目集01

点击查看题目描述
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
电梯运行规则如下:电梯默认停留在1层,状态为静止,当有乘客对电梯发起请求时(各楼层电梯外部乘客按下上行或者下行按钮或者电梯内部乘客按下想要到达的楼层数字按钮),电梯开始移动,当电梯向某个方向移动时,优先处理同方向的请求,当同方向的请求均被处理完毕然后再处理相反方向的请求。电梯运行过程中的状态包括停止、移动中、开门、关门等状态。当电梯停止时,如果有新的请求,就根据请求的方向或位置决定移动方向。电梯在运行到某一楼层时,检查当前是否有请求(访问电梯内请求队列和电梯外请求队列),然后据此决定移动方向。每次移动一个楼层,检查是否有需要停靠的请求,如果有,则开门,处理该楼层的请求,然后关门继续移动。
使用键盘模拟输入乘客的请求,此时要注意处理无效请求情况,例如无效楼层请求,比如超过大楼的最高或最低楼层。还需要考虑电梯的空闲状态,当没有请求时,电梯停留在当前楼层。
请编写一个Java程序,设计一个电梯类,包含状态管理、请求队列管理以及调度算法,并使用一些测试用例,模拟不同的请求顺序,观察电梯的行为是否符合预期,比如是否优先处理同方向的请求,是否在移动过程中处理顺路的请求等。为了降低编程难度,不考虑同时有多个乘客请求同时发生的情况,即采用串行处理乘客的请求方式(电梯只按照规则响应请求队列中当前的乘客请求,响应结束后再响应下一个请求),具体运行规则详见输入输出样例。
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
电梯运行规则如下:电梯默认停留在1层,状态为静止,当有乘客对电梯发起请求时(各楼层电梯外部乘客按下上行或者下行按钮或者电梯内部乘客按下想要到达的楼层数字按钮),电梯开始移动,当电梯向某个方向移动时,优先处理同方向的请求,当同方向的请求均被处理完毕然后再处理相反方向的请求。电梯运行过程中的状态包括停止、移动中、开门、关门等状态。当电梯停止时,如果有新的请求,就根据请求的方向或位置决定移动方向。电梯在运行到某一楼层时,检查当前是否有请求(访问电梯内请求队列和电梯外请求队列),然后据此决定移动方向。每次移动一个楼层,检查是否有需要停靠的请求,如果有,则开门,处理该楼层的请求,然后关门继续移动。
使用键盘模拟输入乘客的请求,此时要注意处理无效请求情况,例如无效楼层请求,比如超过大楼的最高或最低楼层。还需要考虑电梯的空闲状态,当没有请求时,电梯停留在当前楼层。
请编写一个Java程序,设计一个电梯类,包含状态管理、请求队列管理以及调度算法,并使用一些测试用例,模拟不同的请求顺序,观察电梯的行为是否符合预期,比如是否优先处理同方向的请求,是否在移动过程中处理顺路的请求等。为了降低编程难度,不考虑同时有多个乘客请求同时发生的情况,即采用串行处理乘客的请求方式(电梯只按照规则响应请求队列中当前的乘客请求,响应结束后再响应下一个请求),具体运行规则详见输入输出样例。
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door> Close Door
测试用例1:
1
20
<3,UP>
<5>
<6,DOWN>
<7>
<3>
end
预期输出1:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
[电梯调度算法]()

题目集02

点击查看题目描述
对之前电梯调度程序进行迭代性设计,目的为解决电梯类职责过多的问题,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客请求类、队列类以及控制类,具体设计可参考如下类图。
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251117211640118-1486608874.png)
电梯运行规则与前阶段单类设计相同,但要处理如下情况:
乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,继续执行
乘客请求不合理,具体为输入时出现连续的相同请求,例如<3><3><3>或者<5,DOWN><5,DOWN>,处理方法:程序自动忽略相同的多余输入,继续执行,例如<3><3><3>过滤为<3>
注意:本次作业类设计必须符合如上要求(包含但不限于乘客请求类、电梯类、请求队列类及控制类,其中控制类专门负责电梯调度过程),凡是不符合类设计要求此题不得分,另外,PTA得分代码界定为第一次提交的最高分代码(因此千万不要把第一次电梯程序提交到本次题目中测试)。
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door
输入样例1:
1
20
<3,UP>
<5>
<6,DOWN>
<7>
<3>
end
输出样例1:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
输入样例2:
1
20
<3,UP>
<3,UP>
<5>
<5>
<5>
<6,DOWN>
<7>
<7>
<3>
<22,DOWN>
<5,DOWN>
<30>
END
输出样例2:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Open Door # Floor 5
Close Door
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door

题目集03

点击查看题目描述
对之前电梯调度程序再次进行迭代性设计,加入乘客类(Passenger),取消乘客请求类,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客类、队列类以及控制类,具体设计可参考如下类图。
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251117211954673-426240930.png)
电梯运行规则与前阶段相同,但有如下变动情况:
乘客请求输入变动情况:外部请求由之前的<请求楼层数,请求方向>修改为<请求源楼层,请求目的楼层>
对于外部请求,当电梯处理该请求之后(该请求出队),要将<请求源楼层,请求目的楼层>中的请求目的楼层加入到请求内部队列(加到队尾)
注意:本次作业类设计必须符合如上要求(包含但不限于设计电梯类、乘客类、队列类以及控制类),凡是不符合类设计要求此题不得分,另外,PTA得分代码界定为第一次提交的最高分代码(因此千万不要把第一次及第二次电梯程序提交到本次题目中测试)。输入格式:第一行输入最小电梯楼层数。第二行输入最大电梯楼层数。从第三行开始每行输入代表一个乘客请求。电梯内乘客请求格式:<楼层数>电梯外乘客请求格式:<请求源楼层,请求目的楼层>,其中,请求源楼层表示乘客发起请求所在的楼层,请求目的楼层表示乘客想要到达的楼层。当输入“end”时代表输入结束(end不区分大小写)。输出格式:模拟电梯的运行过程,输出方式如下:运行到某一楼层(不需要停留开门),输出一行文本:Current Floor: 楼层数 Direction: 方向运行到某一楼层(需要停留开门)输出两行文本:Open Door # Floor 楼层数Close Door
输入样例1:
1
20
<5,4>
<5>
<7>
end
输出样例1:Current Floor: 1 Direction: UPCurrent Floor: 2 Direction: UPCurrent Floor: 3 Direction: UPCurrent Floor: 4 Direction: UPCurrent Floor: 5 Direction: UPOpen Door # Floor 5Close DoorCurrent Floor: 6 Direction: UPCurrent Floor: 7 Direction: UPOpen Door # Floor 7Close DoorCurrent Floor: 6 Direction: DOWNCurrent Floor: 5 Direction: DOWNOpen Door # Floor 5Close DoorCurrent Floor: 4 Direction: DOWNOpen Door # Floor 4Close Door
输入样例2:120<5,9><8><9,3><4><2>end
输出样例2:Current Floor: 1 Direction: UPCurrent Floor: 2 Direction: UPCurrent Floor: 3 Direction: UPCurrent Floor: 4 Direction: UPCurrent Floor: 5 Direction: UPOpen Door # Floor 5Close DoorCurrent Floor: 6 Direction: UPCurrent Floor: 7 Direction: UPCurrent Floor: 8 Direction: UPOpen Door # Floor 8Close DoorCurrent Floor: 9 Direction: UPOpen Door # Floor 9Close DoorCurrent Floor: 8 Direction: DOWNCurrent Floor: 7 Direction: DOWNCurrent Floor: 6 Direction: DOWNCurrent Floor: 5 Direction: DOWNCurrent Floor: 4 Direction: DOWNOpen Door # Floor 4Close DoorCurrent Floor: 3 Direction: DOWNCurrent Floor: 2 Direction: DOWNOpen Door # Floor 2Close DoorCurrent Floor: 3 Direction: UPCurrent Floor: 4 Direction: UPCurrent Floor: 5 Direction: UPCurrent Floor: 6 Direction: UPCurrent Floor: 7 Direction: UPCurrent Floor: 8 Direction: UPCurrent Floor: 9 Direction: UPOpen Door # Floor 9Close DoorCurrent Floor: 8 Direction: DOWNCurrent Floor: 7 Direction: DOWNCurrent Floor: 6 Direction: DOWNCurrent Floor: 5 Direction: DOWNCurrent Floor: 4 Direction: DOWNCurrent Floor: 3 Direction: DOWNOpen Door # Floor 3Close Door

2. 设计与分析

首先,对题目集01进行分析,题目的重难点在于:对于“同向优先”调度的精准实现,电梯状态与行为的一致性处理(例如,移动过程中不允许修改方向,电梯moving时,必须坚持当前方向,直到同方向请求处理完毕,不能中途因反方向请求切换方向),停靠判断(到达某楼层时,需同时检查内部和外部队列,避免漏查某类请求),对于输入数据的处理(可能存在空格,符号等不规范输入),边界场景的处理(例如超过最高楼层的请求,同一楼层出现多类请求等)。实现的类图如下所示:
image
通过类图可知,一共设计了4个类,分别是:Main类(主类),ElevatorState(电梯状态:枚举类),Elevator(电梯类),Elevator::OutReq(内部辅助类)

四个类的主要功能如下:

(1)Main类:程序入口,用户输入的处理,电梯实例管理(创建ELevator对象并初始化楼层范围,将解析后的请求添加到电梯的请求队列)
(2)ElevatorState:定义电梯运行状态(stopped停止,moving移动)
(3)ELevator:电梯核心属性管理(包括楼层边界,当前楼层,当前运行方向。初始化),请求管理(提供请求入队接口,确保请求合法性),请求处理入口(作为电梯处理请求的总调度,触发移动逻辑直到所有请求完成,并输出当前楼层和方向状态),方向决策(符合“同向优先”的调度逻辑),控制电梯移动与停靠。
(4)ELevator.Outreq:封装外部请求数据,使数据标准化

对代码进行分析,分析结果如下:

点击查看代码分析结果
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119112308928-1246251674.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119112449763-404087600.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119112506779-1635539779.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119112521615-1044757402.png)

同理,我们按照这个思路分析一下题目集02,题目二在题目一的基础上增加了类设计规范强化,输入过滤规则补充,指责边界拆分的要求。具体体现在:类设计必须遵循单一职责原则,强制拆分职责;新增输入过滤规则,用于解决无效请求和重复请求问题;请求队列需区分“外部/内部”的结构化管理。

题目二的实现类图如下所示:

image
从类图可以看出一共有八个类:两个枚举类(Direction,ELevatorState),乘客请求类(外部请求类HallRequest,内部请求类CabinRequest),请求处理类(RequestHandler),电梯设备类(LiftDevice),控制调度类(LiftController),主类(main)

每个类的功能分别为:

(1)Direction:定义电梯的运行方向,包含up上行,down下行,idle空闲三种状态。
(2)ELevatorState:定义电梯运行状态,包含moving移动中,stopped停止两种状态,用于明确电梯在不同阶段的行为边界(如移动时执行楼层切换,停止时执行楼层开关门)
(3)HallRequest:封装电梯外部乘客的请求,用于区分不同外部请求的上下文信息,支持去重。
(4)CabinRequest:封装电梯内部乘客的请求,用于管理内部请求的生命周期,支持去重。
(5)RequestHandler:负责请求的注册,有效性校验,去重和队列管理
(6)LiftDevice:封装电梯的物理属性和基础行为,仅负责“执行”而非“决策”。
(7)LiftController:电梯调度的“大脑”,负责决策逻辑。
(8)Main:程序入口,负责用户输入解析,请求注册触发,电梯运行启动。

对题目二的代码分析如下:

点击查看代码分析结果
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132939448-1243280455.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132259687-248263627.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132339481-1928282036.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132355618-50807646.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132259687-248263627.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132611311-1962859392.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132632808-108082358.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132651247-639295020.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132707145-1006859709.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119132722117-349208016.png)

最后来分析一下题目集03,可见也是在题目二上进行迭代升级。要求新增passenger类,取消“乘客请求类”;外部请求格式与流转规则重构,包括外部请求输入格式变更,新增外部请求流转规则;请求方向推导逻辑中新增“自动推导方向的要求”,即通过源楼层和目的楼层推导方向,若目的楼层>源楼层,则外部请求的方向为UP,以此类推。题目二中类设计遵循SRP,请求过滤规则,电梯运行规则以及输入输出格式的要求没有发生改变
通过以上分析,类图设计如下所示:
image
一共有6个类,分别是:枚举类(Direction,ElevatorState),乘客类(Passenger),请求队列类(RequestQueue),电梯设备类(Elevator),控制调度类(Controller),主类(main)

每个类的主要功能为:

(1)direction:定义电梯运行方向
(2)ElevatorState:定义电梯的运行状态
(3)Passenger:封装乘客的请求信息,提供方向推导方法,通过源楼层和目的楼层的关系自动推导乘客的乘梯方向
(4)RequestQueue:专门管理电梯的请求队列,遵循单一职责原则,负责请求的存储,有效性校验,去重和状态查询
(5)ELevator:封装电梯的物理属性和基础行为,仅负责“执行”而非“决策”
(6)Controller:负责决策逻辑,遵循单一职责原则。
(7)Main:程序入口,负责用户输入解析,乘客请求注册触发,电梯运行启动等。

对题目三的代码分析如下:

点击查看代码分析结果
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135159719-1679420274.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135217055-1525764775.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135231697-1860543027.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135244810-1718759446.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135257184-1566905710.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135313031-1105870978.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135325608-751264069.png)
![image](https://img2024.cnblogs.com/blog/3730143/202511/3730143-20251119135337429-1976235721.png)

3. 采坑心得

在完成第一次的大作业时,我在处理电梯调度逻辑时遇到了困难。对于电梯当前运行方向的判断以及电梯的移动无法做到正确判断。
image
如上图所示,在处理第一个外部请求<3,UP>时,程序可以正确执行,但是后面一个内部请求<3>就没有被正确处理。调试的时候发现,在处理前面一个<3,UP>时,把后加入的<3>也给删除了,这违背了同向优先,队列先进先出的处理原则。
以下是导致出错的代码:

误区1:反方向请求判断逻辑缺失。当前实现未检查“当前楼层>请求楼层"的内部队列(仅检查外部下行队列)导致电梯在7层切换为DOWN方向后,无法识别残留的内部请求<3>。

点击查看代码
private boolean hasDownDirectionRequests() {for (String req : innerQueue) {if (getFloorFromRequest(req) < currentFloor) {return true;}}for (String req : outerDownQueue) {if (getFloorFromRequest(req) < currentFloor) {return true;}}for (String req : outerDownQueue) {if (getFloorFromRequest(req) == currentFloor) {return true;}}return false;
}

误区2:停靠后重新检查方向的逻辑,未处理“同方向无请求但有反方向内部请求”的场景。当电梯在 6 层处理完外部下行请求后,hasSameDirReq(下行方向是否有请求)变为false,但代码仅检查 “是否有上行请求”,未检查 “是否有下行方向的内部请求”,导致 currentDirection 被设为 IDLE,循环提前退出。

点击查看代码
private void recheckDirectionAfterStop() {boolean hasSameDirReq = false;if (currentDirection == Direction.UP) {hasSameDirReq = hasUpDirectionRequests();if (!hasSameDirReq && hasDownDirectionRequests()) {currentDirection = Direction.DOWN;} else if (!hasSameDirReq) {currentDirection = Direction.IDLE; // 此处未检查内部下行请求}} else if (currentDirection == Direction.DOWN) {hasSameDirReq = hasDownDirectionRequests();if (!hasSameDirReq && hasUpDirectionRequests()) {currentDirection = Direction.UP;} else if (!hasSameDirReq) {currentDirection = Direction.IDLE; // 关键错误:此时内部队列有<3>,应保持DOWN方向}}
}

在完成第二次的大作业时,在调试过程中也遇到了一些问题。例如:内部请求方向推导逻辑错误,导致调度决策偏差(如乘客在5层按下7层,方向应为UP;但代码中若上一个内部请求是9层,7小于9会推导为DOWN,与实际需求矛盾。

点击查看代码
Direction dir = cabinRequests.isEmpty() ? Direction.UP :(floor > cabinRequests.getLast().getTargetFloor()) ? Direction.UP :(floor < cabinRequests.getLast().getTargetFloor()) ? Direction.DOWN :cabinRequests.getLast().getRequestDir();

题目三相比之下我觉得难度没有第二题大,题目三主要是类的优化以及外部请求处理的逻辑进行调整,但是在完成过程中也遇到了以下问题:内部请求去重逻辑过度,导致“同楼层多乘客”场景处理错误

点击查看代码
if (!isFloorValid(floor) || internalRequests.contains(floor)) {return;
}
internalRequests.add(floor);

代码用internalRequests.contains(floor)过滤所有同楼层内部请求,但题目中 “内部请求” 可能是多个乘客在电梯内按下同一楼层(如 2 个乘客都要去 5 层),此时应保留多个相同请求(或至少允许一次处理后移除,而非直接拒绝入队),过度去重会导致后续乘客的同楼层请求被忽略。

4. 改进建议

一、类设计与职责边界优化

强化“单一职责原则”,避免类间耦合(题目一将所有逻辑堆在Main类,题目二/三虽拆分了类,但部分类仍存在 “隐性耦合”(如RequestQueue类在题目三中同时处理请求存储、去重、合法性校验,还需关联Elevator的楼层边界判断))

改进方案:
a.拆分 “请求校验” 职责:新增RequestValidator工具类,专门处理楼层合法性、输入格式有效性校验,RequestQueue仅负责队列管理,不再依赖Elevator的楼层边界(通过构造函数传入minFloor和maxFloor)。
b.明确 “决策与执行” 边界:Elevator类仅负责物理行为(移动一层、开关门),不存储任何请求队列;Controller类仅负责调度决策(方向调整、目标计算),不直接操作电梯的物理属性(通过Elevator的setter/getter间接操作)。
c.独立 “去重逻辑”:新增RequestDeduplicator工具类,专门处理 “连续重复请求过滤”,支持内部 / 外部请求的差异化去重规则(如外部请求按 “源 + 目的” 去重,内部请求按 “楼层” 去重),RequestQueue仅负责接收去重后的有效请求。

二、鲁棒性与可维护性提升

提高代码复用与扩展优化(三次题目集的代码复用性差,后续若扩展(如多电梯调度、新增请求类型)需大量修改。)

改进方案:
a.提取公共接口:定义Request接口(包含getTargetFloor()、getDirection()方法),Passenger类实现该接口;定义ElevatorBehavior接口(包含moveOneFloor()、openDoor()、closeDoor()方法),Elevator类实现该接口,便于后续替换不同的请求类型或电梯实现。
b.配置化核心参数:将 “去重时间窗口”(题目二)、“电梯初始方向”、“停靠开关门延迟” 等参数,通过配置类(如ElevatorConfig)统一管理,避免硬编码,后续调整无需修改核心逻辑。
c.编写单元测试:针对核心逻辑(如去重、方向判断、停靠处理)编写单元测试,例如:
——测试连续重复请求是否被过滤;
——测试同向请求是否优先处理;
——测试中间楼层请求是否被正确停靠,确保后续修改不会引入回归 bug。

5. 总结

通过三次电梯调度程序的迭代开发,我巩固了Java基础知识,不少核心能力都有了明显提升。在面向对象设计上,我从一开始把所有逻辑都放在一个类里,慢慢学会按单一职责原则拆分出请求类、控制类等,后来又用Passenger类重构了数据模型,真切理解了“一个类专注做一件事”“数据和对应行为绑定”的意思。
处理复杂逻辑时,我掌握了“把规则说清楚→抽象成逻辑→写成代码”的拆解方法,用结构化设计减少了多余逻辑,还通过细致处理异常情况,让程序更稳定。调试排查方面,学会了用“断点+日志”的方式找问题,养成了先确定问题范围、再深挖代码根源的习惯,也明白代码逻辑必须严格贴合题目要求,不能凭自己的理解随意编写,避免出现功能异常。

接下来我会从三方面继续学习:一是运用设计模式,现在的代码扩展性不够,要好好掌握策略模式、观察者模式等,让新增调度算法、实现多电梯协作时不用大幅修改核心逻辑;二是学习多线程与并发处理,应对实际场景中多请求同时提交、多电梯协同工作等情况,掌握线程安全、解决资源竞争、动态调整调度优先级的相关技术;三是钻研单元测试与自动化验证,给去重、方向判断等核心逻辑编写自动化测试用例,形成“修改代码→自动验证→快速回归检查”的流程,提高代码质量和开发效率。未来,我将带着本次大作业积累的经验,在设计模式应用、并发编程、自动化测试等方面继续深入学习,不断提升自身的编程素养与解决复杂问题的能力。

最后,针对本轮大作业给出一点本人的建议:教学上可以用项目驱动的方式,把电梯调度拆成设计、编码、测试几个阶段推进,针对类图设计、调度算法这些重点,结合实际案例讲明白,课上多聚焦学生容易出错的方向判断、请求去重等问题做针对性答疑。课程题目可以加些 “需求变更” 场景,比如多电梯协同调度,再补充些边界情况说明,适当融入简化的企业实际案例帮学生培养工程思维。作业和实验方面,要求学生给核心功能写单元测试用例,不光看功能正确性,也考察代码鲁棒性,实验里可以加个压力测试任务,模拟多请求同时提交的场景。组织方式上,课上搞小组代码互评让大家互相提改进意见,课下留些拓展任务比如做电梯运行可视化界面,再建个常见问题分享机制,把典型错误和解决办法整理出来方便大家参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/972309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025一对一冲刺最有效课程平台综合榜:权威排名 + 靠谱高性价比推荐

在中高考冲刺的关键节点,家长们在挑选一对一课程时总是陷入焦虑漩涡:担心所选家教机构的课程偏离考试重点,让孩子在宝贵的复习时间里做无用功;害怕投入大量资金后,孩子的成绩却毫无起色;更对市面上真假难辨的口碑…

专转本机构选哪家?江苏地区教育机构实力解析

专转本是专科学生提升学历的重要途径,选择合适的培训机构对考试结果有着直接影响。目前市场上各类教育机构数量众多,其课程设置、师资水平、教学成果等方面存在差异,了解不同机构的特点有助于学生结合自身需求做出判…

2025年规模大型纸箱源头厂家权威推荐榜单:化妆品纸箱/包装纸箱/瓦楞纸箱供应商精选

在电商物流与绿色包装双轮驱动下,大型纸箱包装市场正以每年超过10%的速度持续增长,规模化、智能化生产成为行业主流趋势。 基于企业规模、生产能力、技术实力、质量管控和服务能力等多个维度,本文将为您呈现一份关于…

上海AI投资公司推荐:聚焦智能科技领域的潜力机构

上海作为国内人工智能产业的核心聚集地,近年来在AI技术研发、场景应用及产业投资等领域持续发力。随着AI技术与千行百业的深度融合,优质的AI投资公司不仅为企业发展提供资金支持,更通过技术赋能推动产业升级。本文基…

膜电极外观缺陷检测设备技术应用与行业发展现状

膜电极作为燃料电池、氢能源设备的核心组件,其表面质量直接影响能源转换效率与产品安全性。外观缺陷检测设备通过光学成像、AI算法等技术,实现对膜电极表面划痕、鼓包、异物等瑕疵的高精度识别,在新能源、精密制造等…

专转本机构哪家好?多维度解析选择方向

在学历提升的道路上,专转本是许多专科生提升学历层次、拓宽职业发展空间的重要途径。选择合适的机构不仅能提供专业的备考指导,还能在学习规划、资源支持等方面给予助力。随着市场需求增长,各类职教机构逐渐涌现,了…

python 图片转pdf

python 图片转pdfimport img2pdf# 图片路径列表 images = [rC:\Users\Administrator\Desktop\康南海先生遗墨_page_165.png]# 将图片列表转换为PDF with open(output.pdf, wb) as f:f.write(img2pdf.convert(images))…

上海有哪些AI企业值得投资?行业发展与企业实力解析

上海作为国内人工智能产业的核心发展高地,近年来在政策支持、技术研发与产业应用等方面持续发力,AI企业集群效应显著。随着数据要素市场的完善和人工智能技术的深化应用,具备核心技术壁垒与场景落地能力的AI企业逐渐…

2025 最新苏州美食餐厅推荐!权威测评认证的顶级美食餐厅 榜单发布,宴请 / 约会 / 日常用餐优选指南约会 / 商务宴请 / 请客 / 松鼠桂鱼美食推荐

引言 餐饮行业的多元化发展让消费者面临海量选择,而食材安全、口味创新、场景适配等需求的升级,更凸显了权威推荐的重要性。本次榜单由国际风味暨品质评鉴所(iTQi)提供技术支持,联合全球 20 余国餐饮协会组建专业…

Luogu P6893 [ICPC 2014 WF] Buffed Buffet 题解

Solution01背包不可以贪心,但是分数背包可以。分别考虑两种物品然后枚举合并。 对于 D 类食物,令 \(f(i, j)\) 表示前 \(i\) 种菜吃了 \(j\)​ 克时的最大美味值: \[\begin{aligned} f(i, j) &= \max_{0 \leq k…

苏州一对一辅导机构哪家好?2026实测排行榜,这5家值得重点关注!

苏州家长在挑选一对一家教时,常常被一连串问题困住:“到底哪家机构才算真靠谱?一节课收费多少才在合理范围?怎样选才能避开那些隐形的坑?”——市面上从不缺打着“名校师资”旗号的机构,可教员的真实背景却经不起…

性能优化 | HarmonyOS预加载,三步即可提升APP页面的响应速度

你是否还在为页面响应时间长,资源加载慢苦恼? 通常情况下,面临的选择要么是压缩页面文件,减少图片、文字等静态资源的体积。要么是通过代码调整、设定缓存策略来进一步缩短响应时间。 看起来也许只有短短的几十个字…

CF1437F Emotional Fishermen

这种排列计数题要多分析一下答案的形式。 比如说这个题,答案的形式就是选一些比较大的数,在其中间插入小于前面的 \(\frac{1}{2}\) 的数。 DP 一下即可,重要的是注意到这个形式。

习题解析之:汽车限行

习题解析之:汽车限行【问题描述】 为缓解城市交通压力,武汉市交管局对于长江一桥及江汉一桥实行限行,规定如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮…

立贴明志

365天成为大模型技术专家

石墨文档怎么批量导出?我自己手搓了一个 Chrome 插件(附下载)

写在前面 这篇文章不是什么官方通稿,纯粹是作为一个石墨文档的老用户,来聊聊最近遇到的一个大坑,以及我是怎么填上的。 如果你也像我一样,在石墨文档里存了几百上千个文件,想要把它们下载到本地备份,或者迁移到其…

量子力学作业6

第 6 次作业 习题 6.7 (a) 对 \(\psi(x_1-a,x_2-a)\) 在 \((0,0)\) 处进行泰勒展开: \[\psi(x_1-a, x_2-a) = \sum_{n,m} \frac{1}{n!m!}(-a)^{n+m}\frac{d^n}{dx_1^n}\frac{d^m}{dx_2^m}\psi(x_1, x_2) \]\[= \sum…

【LVGL】选项卡部件

引言 选项卡部件(lv_tabview)选项卡部件相关 api 函数 注意: 对于添加选项卡函数lv_tabview_add_tab(),是有一个相当于容器的返回值的,定义一个对象接收此返回值后,就可以将其作为父对象来创建其他部件了。示例程…

python学习-print

任务1 打印数字 print(2025) 任务2 我是mia print(我是mia) #打印非数字信息需要携带单引号或双引号,表示打印的字符串信息 任务3 创建一个变量year,值为2025,打印出变量year year = 2025 print(year)

WSL2调用摄像头并使用OpenCV - 教程

WSL2调用摄像头并使用OpenCV - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…