Java電梯模擬

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層開門中,下降狀態

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717419.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717419.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

#LLM入門|Prompt#2.1_第二部分:搭建基于 ChatGPT 的問答系統_簡介_Introduction

《第二部分&#xff1a;搭建基于 ChatGPT 的問答系統》&#xff01; 本部分基于吳恩達老師與OpenAI合作開發的課程《Building Systems with the ChatGPT API》創作&#xff0c;旨在指導開發者基于ChatGPT的API進行智能問答系統的構建。 課程內容 課程背景&#xff1a; 使用C…

Web3游戲基礎設施提供商Stardust為Sui上的游戲開發者提供支持

Stardust將其在錢包服務&#xff08;wallets-as-a-service&#xff09;基礎設施和用戶獲取平臺方面的專業知識帶到了Sui&#xff0c;為游戲開發者提供了關鍵的幫助&#xff0c;以吸引玩家。近日&#xff0c;Stardust公司宣布將為Sui游戲開發者調整其成熟的錢包服務&#xff08;…

MySQL:開始深入其數據(四)select子查詢

select眼熟吧?(都三節了) 又開始學習了 在 MySQL 中&#xff0c;子查詢&#xff08;subquery&#xff09;是指在一個查詢內嵌套另一個完整的 SELECT 語句。子查詢可以嵌套在 SELECT、INSERT、UPDATE、DELETE 語句中&#xff0c;用于從內部查詢結果中獲取數據&#xff0c;進而完…

vue3 的await async

在 Vue 3&#xff08;以及大多數現代的 JavaScript 環境中&#xff09;中&#xff0c;async 和 await 是用來處理異步操作的關鍵字。這些關鍵字使你能夠以同步的方式編寫異步代碼&#xff0c;使代碼更加易讀、易寫&#xff0c;并且有助于管理異步流程。 async async 關鍵字用…

基于springboot的寵物咖啡館平臺的設計與實現論文

基于Spring Boot的寵物咖啡館平臺的設計與實現 摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了基于Spring Boot的寵物咖啡館平臺的設計與實現的開發全過程。通過分析基于Spring Boot的寵物咖啡館平臺的設計與…

每日一題——LeetCode1566.重復至少K次且長度為M的模式

方法一 暴力枚舉 var containsPattern function(arr, m, k) {const n arr.length;for (let l 0; l < n - m * k; l) {let offset;for (offset 0; offset < m * k; offset) {if (arr[l offset] ! arr[l offset % m]) {break;}}if (offset m * k) {return true;}}r…

k8s 網絡概念與策略控制

一、Kubernetes 基本網絡模型 Kubernetes 的容器網絡模型可以把它歸結為約法三章和四大目標。 1、約法三章 約法三章確保了Kubernetes容器網絡模型的基本特性&#xff1a; ① 任意兩個 pod 之間可以直接通信&#xff1a;在Kubernetes中&#xff0c;每個 Pod 都被分配了一個…

題記(47)--連續因子

目錄 一、題目內容 二、輸入描述 三、輸出描述 四、輸入輸出示例 五、完整C語言代碼 一、題目內容 一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3567&#xff0c;其中 5、6、7 就是 3 個連續的數字。給定任一正整數 N&#xff0c;要求編寫程序求出…

React-router的創建和第一個組件

需要先學react框架 首先&#xff1a;找到一個文件夾&#xff0c;在文件夾出打開cmd窗口&#xff0c;輸入如下圖的口令 npx create-react-app demo 然后等待安裝 安裝完成 接下來進入創建的demo實例 cd demo 然后可以用如下方式打開vscode code . 注意&#xff1a;不要忽略點號與…

Vue--》打造簡易直播應用平臺項目實戰

今天開始使用 vue3 + ts 搭建一個簡易直播應用平臺項目,因為文章會將項目的每一個地方代碼的書寫都會講解到,所以本項目會分成好幾篇文章進行講解,我會在最后一篇文章中會將項目代碼開源到我的github上,大家可以自行去進行下載運行,希望本文章對有幫助的朋友們能多多關注本…

AWS對文本進行語言識別

AWS提供了名為Amazon Comprehend 的服務&#xff0c;它支持對文本進行語言識別。Amazon Comprehend 是一項自然語言處理&#xff08;NLP&#xff09;服務&#xff0c;它可以用于分析文本并提取有關文本內容的信息。 我們可以通過使用 Amazon Comprehend API 輕松地集成這些功能…

機械臂與tftp

機械臂&#xff1a; #include<myhead.h> #define SER_IP "192.168.126.2" #define SER_PORT 8888#define CLI_IP "192.168.252.165" #define CLI_PORT 9999int main(int argc, const char *argv[]) {int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-…

支持向量機 SVM | 線性可分:公式推導

目錄 一. SVM的優越性二. SVM算法推導小節概念 在開始講述SVM算法之前&#xff0c;我們先來看一段定義&#xff1a; 支持向量機(Support VecorMachine, SVM)本身是一個二元分類算法&#xff0c;支持線性分類和非線性分類的分類應用&#xff0c;同時通過OvR或者OvO的方式可以應用…

安裝Docker及DockerCompose

0.安裝Docker Docker 分為 CE 和 EE 兩大版本。CE 即社區版&#xff08;免費&#xff0c;支持周期 7 個月&#xff09;&#xff0c;EE 即企業版&#xff0c;強調安全&#xff0c;付費使用&#xff0c;支持周期 24 個月。 Docker CE 分為 stable test 和 nightly 三個更新頻道…

10.輪廓系數-機器學習模型性能的常用的評估指標

輪廓系數&#xff08;Silhouette Coefficient&#xff09;是評估聚類算法效果的常用指標之一。它結合了聚類的凝聚度&#xff08;Cohesion&#xff09;和分離度&#xff08;Separation&#xff09;&#xff0c;能夠量化聚類結果的緊密度和分離度。 背景 1.聚類分析的背景 在…

NDK介紹

NDK&#xff08;Native Development Kit&#xff09;是一個用于在Android平臺上開發C和C代碼的工具集。它允許開發人員使用C和C編寫部分代碼&#xff0c;并將其編譯為本機代碼庫&#xff08;.so文件&#xff09;&#xff0c;然后通過JNI在Java應用程序中調用這些本地代碼。 ND…

CUDA學習筆記01:vs2019環境配置

為了在window11 vs2019下使用CUDA編程&#xff0c;配置了一下環境&#xff0c;但是我電腦一開始自帶CUDA&#xff0c;然后再安裝的vs2019&#xff0c;這樣安裝順序上是不對的&#xff0c;vs2019找不到CUDA配置項&#xff0c;網上找了很多辦法貌似都不好使而且很復雜。 那么最快…

c++之拷貝構造和賦值

如果一個構造函數中的第一個參數是類本身的引用&#xff0c;或者是其他的參數都有默認值&#xff0c;則該構造函數為拷貝構造函數。 那么什么是拷貝構造呢&#xff1f;利用同類對象構造一個新對象。 1&#xff0c;函數名和類必須同名。 2&#xff0c;沒有返回值。 3&#x…

Linux多線程控制:深入理解與應用(萬字詳解!)

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;どうして (feat. 野田愛実) 0:44━━━━━━?&#x1f49f;──────── 3:01 &#x1f504; ?? ? ?? …

6.2 指標的應用與設計(12%)

1、指標的作用 用簡約的匯總數據量化業務強弱。 2、指標的理解 特點&#xff1a; &#xff08;1&#xff09;指標是游離態的&#xff0c;無法單獨實現數據統計 eg&#xff1a;總銷售額、總銷售量 &#xff08;2&#xff09;需與統計維度結合&#xff0c;明確統計指標的對…