一个电梯运行的简单模拟实现

本文介绍了一个使用Java编写的电梯模拟器,基于时间优先策略处理按钮事件。模拟器包括电梯的三种状态、楼层指示灯的三种状态以及开门、上人和移动的逻辑。作者还提到在原有面向过程的实现基础上,根据qiuyibo7777的建议,改用策略模式重构代码,减少了if-else判断,提高了可读性。文章强调模式的应用应以解决问题为主,而非单纯追求模式的使用。
摘要由CSDN通过智能技术生成

用Java写了一个类似电梯模拟器的一段代码,运行了下,还没有发现大问题,记录如下:

基本思路:

模拟电梯运行(为单一电梯,未考虑达到承载上限,最短等待时间等问题)

基本条件:

1、电梯有三种状态:静止,向上,向下。

2、每层的指示灯有三种状态:向上、向下、到达(只开门)。

3、开门上人1秒,每上或下一层用0.1秒。

 

实现方案:

使用一个队列(可看做时间优先)将所有按钮事件依次入队。

当电梯静止时首先响应队头的按钮事件,并根据按钮楼层和当前楼层的位置确定移动方向; 当向上移动时,将移动到所有亮灯的按钮所在楼层的最高层,当按钮方向和电梯方向一致时或该楼层内部到达按钮亮起时开门;向下移动类似。 当队列中没有按钮事件时,电梯静止。有些类似LOOK算数,但没有按钮事件时不会来回扫描。

使用主线程来控制电梯上下,需要注意同步“设置和获取电梯按钮最高层或按钮最底层数的方法”。

 

主方法用来不断循环监测:

while(true){
			if(!ele.getPushedFloor().isEmpty()){
				int nextFloor = ele.getPushedFloor().peek();
				if(nextFloor > 0){//向上的按钮
					if(ele.getCurFloor() - nextFloor <= 0){
						ele.liftUp();
					}else if(ele.getCurFloor() - nextFloor > 0){
						ele.liftDown();
					}
				}else{//向下的按钮
					if(ele.getCurFloor() + nextFloor < 0){
						ele.liftUp();
					}else if(ele.getCurFloor() + nextFloor >= 0){
						ele.liftDown();
					}
				}
			}else{
				ele.setStat(RunningStat.INIT);
			}
			Thread.sleep(100);
		}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值