一、实现结果说明
这里首先说明实现结果:
1、已实现:
- 实现电梯的移动逻辑。
- 实现了电梯外部的每个楼层的上下按钮。
- 实现了电梯运行的同时添加新楼层。
2、未实现:
- 没有实现电梯内部的按钮。
- 没有实现多个电梯协同运行。
- 没有实现电梯开关门时的逻辑。
二、电梯运行的情况
- 当电梯向上移动时,会一直运行至发出请求的所有楼层中最高的楼层。
- 向下移动时,会一直运行至发生请求的所有楼层中最低的楼层。
- 在电梯运行过程中,如果有用户点击了某一层的按钮,会根据该层的按钮与当前电梯所在的层数和电梯要去的层数相比较,以及判断电梯的运行方向,来确定下一步去往的楼层。
三、实现说明
该代码实现使用 Java 编写,使用多线程
来分析处理电梯的移动,以及各个楼层的按钮点击处理。
当然,没有展示的页面,Java 编写可视化页面还是相当吃翔的。采用控制台输出
的方式来告诉开发者现在电梯所在的楼层。
实现代码中目前一共包含七个类(多数属于非严格的单例对象):
- Lift.java:负责电梯的移动,从任务列表中取得任务,并判断电梯应该运行的方向。
- LayerRequest.java:这个类是定义的一个
数据结构
,用来保存每个楼层的请求。负责处理电梯获取或者删除任务的请求,以及各个楼层召唤电梯的请求。 - LayerList.java:该类保存着每个楼层。是一个继承了 ArrayList 的类。
- Layer.java:该类表示的是单个楼层,存储着某个楼层的信息。
- MoveDirection.java:电梯的移动方向,电梯的移动方向有三种:UP、DOWN、STOP。
- Client.java:客户端处理类,电梯与外界交互就靠这一个类,可以使用该类向电梯发送上升或者下降的请求。同时该类管理着一个线程池。
- Test.java:测试类。
四、部分代码解析
如果要查看源代码,可以从 CSDN 上下载 ZIP 文件 CSDN —— Java 实现电梯逻辑。
同时也提供了 GitHub 项目地址:GitHub —— Java 实现电梯逻辑。
1、Lift.java 核心代码
/**
* 向上移动电梯
*/
private void moveUp() {
int currentLayerNumber = this.getCurrentLayer().getLayerNumber();
int targetLayerNumber;
while (currentLayerNumber < (targetLayerNumber = this.getTargetLayer().getLayerNumber())) {
this.moving();
Layer layer = this.layerList.get(currentLayerNumber);
this.setCurrentLayer(layer);
currentLayerNumber++;
if (currentLayerNumber != targetLayerNumber) {
this.passLayer(layer);
}
}
this.reachTargetLayer();
}
/**
* 向下移动电梯
*/
private void moveDown() {
int currentLayerNumber = this.getCurrentLayer().getLayerNumber();
int targetLayerNumber;
while (currentLayerNumber > (targetLayerNumber = this.getTargetLayer().getLayerNumber())) {
this.moving();
// 这里减二是因为:
// 需要通过索引获取楼层, getLayerNumber() 对索引进行了加一, 需要减一获得索引,
// 而这里是电梯下降, 需要获取下一个楼层的索引, 所以还要再减一
Layer layer = this.layerList.get(currentLayerNumber - 2);
this.setCurrentLayer(layer);
currentLayerNumber--;
if (currentLayerNumber != targetLayerNumber) {
this.passLayer(layer);
}
}
this.reachTargetLayer();
}
/**
* 移动电梯到目标楼层
*/
private void move(int diff) {
if (diff > 0) {
moveDown();
} else {
moveUp();
}
}
/**
* 电梯运行, 主要负责电梯的移动
*/
void