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{


    @Override
    protected void pressFloor(Integer[] floors) {
        if (floors!=null && floors.length>0){

        this.abstractEvevator.status.handler(this,floors);
        }
    }

    @Override
    protected void handler(int currentFloor, Status status, AbstarctDispatcher abstarctDispatcher) {
        this.abstractEvevator.status.handler(currentFloor,status,abstarctDispatcher);
    }




    @Override
    public void upEve(Integer floor) {
        this.abstractEvevator.up(floor);
    }

    @Override
    public 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);
    }

    @Override
    void up(int floor) {
        if (floor==this.currentFloor){
            openDoor(floor);
        }else {
            this.currentFloor = floor;
            System.out.println("电梯正在上升至:" + floor);
            openDoor(floor);
        }
    }


    @Override
    void down(int floor) {
        if (floor==this.currentFloor){
            openDoor(floor);
        }else {
            this.currentFloor = floor;
            System.out.println("电梯正在下降至:"+floor);
            openDoor(floor);
        }
    }


    @Override
    void openDoor(int floor) {
        System.out.println(floor+"层开门中,"+status.NAME+"状态");
    }

    @Override
    void 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);
    }



    @Override
    protected 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);
    }

    @Override
    public void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {
        if (eveFloor<personFloor){
            floorList.add(personFloor);
        }
    }

    @Override
    public 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);

        }
    }

    @Override
    void 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);
    }


    @Override
    public void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {
        floorList.add(personFloor);
    }

    @Override
    public 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);

        }
    }

    @Override
    void 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);
    }

    @Override
    public void judgeAdd(int eveFloor, int personFloor, Set<Integer> floorList) {
        if (eveFloor>personFloor){
            floorList.add(personFloor);
        }
    }

    @Override
    public void handler(int currentFloor, Status status,AbstarctDispatcher abstarctDispatcher) {
        status.handler(currentFloor,status,abstarctDispatcher);
    }

    @Override
    void 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层开门中,下降状态

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【间说八股】面试官:我看你这里用到了模板模式?你能不能说一下什么是模板模式

模板模式 行为模式&#xff1a;这类模式负责对象间的高效沟通和职责委派。 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 模板方法模式是一种行为设计模式&#xff0c;其核心思想…

下载github项目到pycharm

一、下载git 1.下载git链接 https://git-scm.com/ 2.一路点击next&#xff0c;最后finish 二、使用git 1.安装成功后在开始菜单栏会找到如下内容&#xff0c;其中常用的是Git Bash 2.点击Git Bash 3.这里就可以克隆github上的代码了 点击复制&#xff0c;在命令行输入…

H264的打包,nal,es,pes,pts,dts,ps,ts

编码层次 视频编码层&#xff1a;预测、变换、量化、熵编码等操作slice层&#xff1a;将视频帧分割成若干个编码单元&#xff0c;包含一定数量的宏块&#xff0c;提高编解码的并行性和容错性。NAL层&#xff1a;提升对网络传输和数据存储的亲和性 视频编码层 基准-Baseline …

盘点实用又有意思的工具网站-搜嗖工具箱

生命倒计时 www.thismuchlonger.com 这是一个相哇塞的网站&#xff0c;可以让我们静下心来好好想想我们来这个世界究竟为了什么&#xff0c;因为当我们作为命运的主宰者。敲打键盘设定好自己一生长度的时候&#xff0c;我们的剩余寿命已经成绝对值&#xff0c;一旦生命变为了绝…

飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)

文章目录 代码准备创建jenkins 任务测试推送使用项目里面的jenkinsfile 进行升级操作 文字版本流程项目构建 代码准备 推送代码到gitlab 代码去叩叮狼教育找 k8s 创建jenkins 任务 创建一个k8s-cicd-demo 流水线任务 将jenkins 里面构建时候的地址还有token&#xff0c; 给到…

基于分位数回归的长短期记忆神经网络(QRLSTM)的MATLAB实现(源代码)

分位数回归的长短期神经记忆网络介绍&#xff1a; QRLSTM&#xff08;Quantile Regression Long Short-Term Memory&#xff09;分位数回归神经网络是一种结合了长短期记忆&#xff08;LSTM&#xff09;神经网络和分位数回归的模型。这种神经网络结构旨在对数据的不同分位数进行…

企业数字化的重要性与步骤:转型之道解析

什么是企业数字化&#xff1f;企业是否需要数字化转型&#xff1f;数字化转型对于企业究竟有什么好处&#xff1f;企业如何进行数字化转型&#xff1f;时代浪潮下&#xff0c;这是近两年大部分企业最关心的问题。今天一文解决您的有关“数字化”的疑问。 一、什么是数字化 什么…

简单的input框输入竟然异常卡顿,一个日常性能问题的排查思路

我们公司产品主要提供企业项目管理服务&#xff0c;那么自然有配套的desk工单管理系统&#xff0c;用于搜集客户bug以及相关问题反馈。有一天我在测试功能时碰巧发现了一个bug&#xff0c;所以就想着提一个工单记录下方便日后修复。但就在创建工单填写标题时我发现标题输入卡爆…

C++调用lua函数

C 调用Lua全局变量(普通) lua_getglobal(lua, "width");int width lua_tointeger(lua,-1);lua_pop(lua,1);std::cout << width << std::endl;lua_close(lua); 这几行代码要放到lua_pcall(lua, 0,0,0);之后才可以. C给lua传递变量 lua_pushstring(lua, …

数独游戏(dfs)

代码注释如下 #include <iostream> using namespace std; const int N 10; bool col[N][N], rol[N][N], cell[3][3][N]; char g[N][N]; bool dfs(int x, int y) { //用bool这样在找到一个方案就可以迅速退出if(y 9) x, y 0; //若y超出边界&#xff0c;则第二…

LeetCode---【链表的操作】

目录 206反转链表【链表结构基础】21合并两个有序链表【递归】我的答案【错误】自己修改【超出时间限制】在官方那里学到的【然后自己复写,错误】对照官方【自己修改】 160相交链表【未理解题目目的】在b站up那里学到的【然后自己复写,错误】【超出时间限制】对照官方【自己修改…

【微服务生态】Nginx

文章目录 一、概述二、Nginx 的安装三、常用命令四、Nginx 配置4.1 反向代理配置&#xff08;1&#xff09;反向代理实例1&#xff08;2&#xff09;反向代理实例2 4.2 负载均衡配置4.3 动静分离4.4 集群配置 五、nginx 原理与优化参数配置 一、概述 本次为简易版&#xff0c;…

【Web】速谈FastJson反序列化中JdbcRowSetImpl的利用

目录 简要原理分析 exp 前文&#xff1a;【Web】速谈FastJson反序列化中TemplatesImpl的利用 简要原理分析 前文的TemplatesImpl链存在严重限制&#xff0c;即JSON.parseObject()需要开启Feature.SupportNonPublicField fastjson的第二条链JdbcRowSetImpl&#xff0c;主要…

Android Gradle开发与应用 (三) : Groovy语法概念与闭包

1. Groovy介绍 Groovy是一种基于Java平台的动态编程语言&#xff0c;与Java是完全兼容&#xff0c;除此之外有很多的语法糖来方便我们开发。Groovy代码能够直接运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;也可以被编译成Java字节码文件。 以下是Groovy的一些…

STM32标准库开发——WDG看门狗

WDG&#xff08;Watchdo&#xff09;看门狗介绍 独立看门狗&#xff0c;独立运行&#xff0c;有自己的专门时钟——内部低速时钟LSI&#xff0c;只要在最晚喂狗时间前喂狗就不会导致自动复位 窗口看门狗&#xff0c;用的是APB1的时钟&#xff0c;不是独立的时钟。喂狗时间比较严…

汽车虚拟仿真技术的实现、应用和未来

汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术&#xff0c;以实现对汽车行为的分析、评估和改进。汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具&#xff0c;可以大大缩短产品研发周期、降低研发成本和提高产品质量。本文将从汽车虚拟仿真技术的实现过程、应用…

【详识JAVA语言】类和对象

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想来…

排序算法——快速排序的非递归写法

快速排序的非递归 我们写快速排序的时候&#xff0c;通常用的递归的方法实现快速排序&#xff0c;那么有没有非递归的方法实现快速排序呢&#xff1f;肯定是有的。思想还是一样的&#xff0c;不过非递归是看似是非递归其实还是递归。 思路解释 快速排序的非递归使用的是栈这…

【yolov8部署实战】VS2019+Onnxruntime环境部署yolov8-seg分割模型|含详细注释源码

0、前言 在之前博客中已经实现用onnxruntime来部署yolov8的目标检测模型&#xff08;cpu和gpu皆可&#xff09;。感兴趣的可以看看&#xff1a;【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolov8目标检测|含源码 今天为大家带来的是yolov8-seg分割模型用onnxrunt…

Maven(黑马学习笔记)

初识Maven 什么是Maven Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 官网&#xff1a;https://maven.apache.org/ Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&#xff0…