Java電梯模擬
文章目錄
- Java電梯模擬
- 前言
- 一、UML類圖
- 二、代碼
- 三、測試
前言
此程序為單線程簡單模擬電梯(初版),如果存在問題或者設計不合理的地方,請大家幫忙指出。
一、UML類圖
二、代碼
電梯調度器
package cn.xx.evevator;import java.util.*;public abstract class AbstarctDispatcher {protected final Set<Integer> floorList = new LinkedHashSet<>();private final HashMap<Integer,Floor> floorObjMap = new HashMap<>(11);protected AbstractEvevator abstractEvevator;public void setAbstractEvevator(AbstractEvevator abstractEvevator) {this.abstractEvevator = abstractEvevator;}protected abstract void pressFloor(Integer[] floors);public void newPressPanel(String name,int currentFloor, Status status){System.out.println(name+"在"+currentFloor+"層按了"+status.NAME+"鍵");// 暫時不考慮反方向if (abstractEvevator.status != StatusCommon.stopStatus && abstractEvevator.status.NAME.equals(status.NAME)) {abstractEvevator.status.judgeAdd(abstractEvevator.currentFloor,currentFloor,floorList);}if (abstractEvevator.status == StatusCommon.stopStatus) {if (abstractEvevator.currentFloor==currentFloor){abstractEvevator.openDoor(currentFloor);}if (abstractEvevator.currentFloor<currentFloor){abstractEvevator.up(currentFloor);}if (abstractEvevator.currentFloor>currentFloor){abstractEvevator.down(currentFloor);}}abstractEvevator.run();handler(currentFloor,status,this);}public void addFloor(int floor){floorList.add(floor);}protected abstract void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher);public void removeFloorObj(Integer floor){this.floorObjMap.remove(floor);}public abstract void upEve(Integer floor);public abstract void downEve(Integer floor);public Floor getFloorObj(Integer floor) {return floorObjMap.get(floor);}public void putFloorObj(Integer currentFloor,Floor floor){this.floorObjMap.put(currentFloor,floor);}}
調度器繼承類
package cn.xx.evevator;import java.util.Arrays;public class Dispatcher extends AbstarctDispatcher{@Overrideprotected void pressFloor(Integer[] floors) {if (floors!=null && floors.length>0){this.abstractEvevator.status.handler(this,floors);}}@Overrideprotected void handler(int currentFloor, Status status, AbstarctDispatcher abstarctDispatcher) {this.abstractEvevator.status.handler(currentFloor,status,abstarctDispatcher);}@Overridepublic void upEve(Integer floor) {this.abstractEvevator.up(floor);}@Overridepublic void downEve(Integer floor) {this.abstractEvevator.down(floor);}}
電梯類
package cn.xx.evevator;public abstract class AbstractEvevator {protected final AbstarctDispatcher abstarctDispatcher;protected Status status = StatusCommon.stopStatus;protected Integer currentFloor = 1;protected AbstractEvevator(AbstarctDispatcher abstarctDispatcher) {this.abstarctDispatcher = abstarctDispatcher;}abstract void up(int floor);abstract void down(int floor);abstract void openDoor(int floor);abstract void show();void run(){show();}}
電梯繼承類
package cn.xx.evevator;public class Evevator extends AbstractEvevator{protected Evevator(AbstarctDispatcher abstarctDispatcher ) {super(abstarctDispatcher);}@Overridevoid up(int floor) {if (floor==this.currentFloor){openDoor(floor);}else {this.currentFloor = floor;System.out.println("電梯正在上升至:" + floor);openDoor(floor);}}@Overridevoid down(int floor) {if (floor==this.currentFloor){openDoor(floor);}else {this.currentFloor = floor;System.out.println("電梯正在下降至:"+floor);openDoor(floor);}}@Overridevoid openDoor(int floor) {System.out.println(floor+"層開門中,"+status.NAME+"狀態");}@Overridevoid show() {System.out.println("電梯狀態:"+this.status.NAME+",樓層:"+this.currentFloor);}
}
樓層
package cn.xx.evevator;import java.util.HashMap;
import java.util.LinkedHashSet;public abstract class AbstractFloor {protected final int currentFloor;protected final Status status;protected final Person person;protected AbstarctDispatcher abstarctDispatcher;protected HashMap<Integer, LinkedHashSet<Person>> personList = new HashMap<>();protected AbstractFloor(int currentFloor, Status status, Person person) {this.currentFloor = currentFloor;this.status = status;this.person = person;this.abstarctDispatcher = person.abstarctDispatcher;LinkedHashSet<Person> people = this.personList.get(currentFloor);if (people!=null && people.size()>0){people.add(person);}else{LinkedHashSet<Person> people1 = new LinkedHashSet<>();people1.add(person);personList.put(currentFloor,people1);}}protected abstract void notifyPersonLiftHere();}
樓層繼承類
package cn.xx.evevator;import java.util.LinkedHashSet;public class Floor extends AbstractFloor{protected Floor(int currentFloor, Status status, Person person) {super(currentFloor, status, person);}@Overrideprotected void notifyPersonLiftHere() {LinkedHashSet<Person> people = this.personList.get(currentFloor);if (people!=null && people.size()>0){for (Person person1 : people) {if (person1.floor.status.NAME.equals(person1.abstarctDispatcher.abstractEvevator.status.NAME)) {person1.elevatorIsHere(currentFloor);}}}}}
狀態類
package cn.xx.evevator;import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;public abstract class Status {public final String NAME;protected Status(String name) {NAME = name;}abstract void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList);/*** 這個主要用于用戶在樓層中按電梯* @param currentFloor* @param status* @param abstarctDispatcher*/abstract void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher);/*** 這個主要用于在電梯中按樓層* @param abstarctDispatcher*/abstract void handler(AbstarctDispatcher abstarctDispatcher,Integer[] floors);void sortFloor(Status status,Integer[] floors, Set<Integer> floorList){Arrays.sort(floors);if (status.NAME.equals(StatusCommon.downStatus.NAME)){Arrays.sort(floors,Collections.reverseOrder());}for (int floor : floors) {if (floor>11 || floor<0){System.out.println("樓層輸入錯誤");continue;}if (!floorList.contains(floor))floorList.add(floor);}}
}
上升狀態
package cn.xx.evevator;import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;public class UpStatus extends Status{public UpStatus(String name) {super(name);}@Overridepublic void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {if (eveFloor<personFloor){floorList.add(personFloor);}}@Overridepublic void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher) {abstarctDispatcher.abstractEvevator.status = this;if (abstarctDispatcher.abstractEvevator.currentFloor>currentFloor){return;}for (Integer floor : abstarctDispatcher.floorList) {if (abstarctDispatcher.abstractEvevator.currentFloor==floor){
// abstarctDispatcher.abstractEvevator.openDoor(floor);}else {abstarctDispatcher.upEve(floor);}abstarctDispatcher.floorList.remove(floor);Floor floorObj = abstarctDispatcher.getFloorObj(floor);floorObj.notifyPersonLiftHere();abstarctDispatcher.removeFloorObj(floor);}}@Overridevoid handler(AbstarctDispatcher abstarctDispatcher,Integer[] floors) {sortFloor(StatusCommon.upstatus,floors,abstarctDispatcher.floorList);for (int floor : floors) {if (floor>11 || floor<0){System.out.println("樓層輸入錯誤");continue;}if (!abstarctDispatcher.floorList.contains(floor))abstarctDispatcher.floorList.add(floor);}Iterator<Integer> iterator = abstarctDispatcher.floorList.iterator();while (iterator.hasNext()) {Integer next = iterator.next();abstarctDispatcher.abstractEvevator.currentFloor=next;abstarctDispatcher.upEve(next);iterator.remove();}abstarctDispatcher.abstractEvevator.status = StatusCommon.stopStatus;}
}
下降狀態
package cn.xx.evevator;import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;public class DownStatus extends Status{public DownStatus(String name) {super(name);}@Overridepublic void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {floorList.add(personFloor);}@Overridepublic void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher) {abstarctDispatcher.abstractEvevator.status = this;if (abstarctDispatcher.abstractEvevator.currentFloor<currentFloor){return;}for (Integer floor : abstarctDispatcher.floorList) {if (abstarctDispatcher.abstractEvevator.currentFloor==floor){abstarctDispatcher.abstractEvevator.openDoor(floor);}else {abstarctDispatcher.downEve(floor);}abstarctDispatcher.floorList.remove(floor);Floor floorObj = abstarctDispatcher.getFloorObj(floor);floorObj.notifyPersonLiftHere();abstarctDispatcher.removeFloorObj(floor);}}@Overridevoid handler(AbstarctDispatcher abstarctDispatcher,Integer[] floors) {sortFloor(StatusCommon.downStatus,floors,abstarctDispatcher.floorList);Iterator<Integer> iterator = abstarctDispatcher.floorList.iterator();while (iterator.hasNext()) {Integer next = iterator.next();abstarctDispatcher.abstractEvevator.currentFloor=next;abstarctDispatcher.downEve(next);iterator.remove();}abstarctDispatcher.abstractEvevator.status = StatusCommon.stopStatus;}
}
停止狀態
package cn.xx.evevator;import java.util.Set;public class StopStatus extends Status{public StopStatus(String name) {super(name);}@Overridepublic void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {if (eveFloor>personFloor){floorList.add(personFloor);}}@Overridepublic void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher) {status.handler(currentFloor,status,abstarctDispatcher);}@Overridevoid handler(AbstarctDispatcher abstarctDispatcher,Integer[] floors) {}
}
人員類
package cn.xx.evevator;import org.springframework.util.StringUtils;public class Person {protected Floor floor;protected final AbstarctDispatcher abstarctDispatcher;protected final Integer[] expectFloor;protected final String name;private Person(AbstarctDispatcher abstarctDispatcher, Integer[] expectFloor, String name) {this.abstarctDispatcher = abstarctDispatcher;this.expectFloor = expectFloor;this.name = name;}public void setFloor(Floor floor){this.floor = floor;abstarctDispatcher.putFloorObj(floor.currentFloor,floor);abstarctDispatcher.addFloor(floor.currentFloor);abstarctDispatcher.newPressPanel(name,floor.currentFloor,floor.status);}public void press(Integer[] floor){abstarctDispatcher.pressFloor(floor);}public void elevatorIsHere(int floor){System.out.println(floor+"層到了,"+this.name+"請進電梯!");press(expectFloor);}public static class Builder{private AbstarctDispatcher abstarctDispatcher;private Integer[] expectFloor;private String name;public Builder(AbstarctDispatcher abstarctDispatcher){this.abstarctDispatcher = abstarctDispatcher;}public Builder expectFloor(Integer[] expectFloor){this.expectFloor = expectFloor;return this;}public Builder name(String name){if (StringUtils.isEmpty(name)){this.name = "";}else{this.name = name;}return this;}public Person build(){return new Person(abstarctDispatcher,expectFloor,name);}}}
狀態common
package cn.xx.evevator;public class StatusCommon {public static final UpStatus upstatus = new UpStatus("上升");public static final DownStatus downStatus = new DownStatus("下降");public static final StopStatus stopStatus = new StopStatus("停止");}
三、測試
public class Test {public static void main(String[] args) {Dispatcher dispatcher = new Dispatcher();Evevator evevator = new Evevator(dispatcher);dispatcher.setAbstractEvevator(evevator);// 張三在2層按了上行行鍵 進去電梯后按6樓和8樓Person person = new Person.Builder(dispatcher).name("張三").expectFloor(new Integer[]{3, 1}).build();person.setFloor(new Floor(11, StatusCommon.downStatus,person));// 李四在8層按了上行鍵 進去電梯后按10樓和11樓Person person1 = new Person.Builder(dispatcher).name("李四").expectFloor(new Integer[]{10,11}).build();person1.setFloor(new Floor(8,StatusCommon.upstatus,person1));// 王五在3層按了上行鍵 進去電梯后按9樓和11樓Person person3 = new Person.Builder(dispatcher).name("王五").expectFloor(new Integer[]{9,11}).build();person3.setFloor(new Floor(3,StatusCommon.upstatus,person3));// 王五在6層按了下行鍵 進去電梯后按5樓和1樓Person person2 = new Person.Builder(dispatcher).name("劉九").expectFloor(new Integer[]{1,5}).build();person2.setFloor(new Floor(6,StatusCommon.downStatus,person2));}
}
運行結果:
張三在11層按了下降鍵
電梯正在上升至:11
11層開門中,停止狀態
電梯狀態:停止,樓層:11
11層開門中,下降狀態
11層到了,張三請進電梯!
3層開門中,下降狀態
1層開門中,下降狀態
李四在8層按了上升鍵
電梯正在上升至:8
8層開門中,停止狀態
電梯狀態:停止,樓層:8
8層到了,李四請進電梯!
10層開門中,上升狀態
11層開門中,上升狀態
王五在3層按了上升鍵
電梯正在下降至:3
3層開門中,停止狀態
電梯狀態:停止,樓層:3
3層到了,王五請進電梯!
9層開門中,上升狀態
11層開門中,上升狀態
劉九在6層按了下降鍵
電梯正在下降至:6
6層開門中,停止狀態
電梯狀態:停止,樓層:6
6層開門中,下降狀態
6層到了,劉九請進電梯!
5層開門中,下降狀態
1層開門中,下降狀態