• 设计原则 练习2


    第二题
    某停车场,分三层,每层100车位
    每个车位都能监控到车辆的驶入和离开
    车辆进入前,显示每层的空余车辆数量
    车辆进入时,摄像头可识别车牌号和时间
    车辆出来时,出口显示器显示车牌号和停车时长

    题目:画出UML类图

    代码

    // 车辆
    class Car{
        constructor(number) {
            this.number = number;
        }
    }
    
    // 摄像头
    class Camera {
        shot(car) {
            return {
                num: car.num,
                inTime: Date.now()
            }
        }
    }
    
    // 出口显示屏
    class Screen {
        show(car, inTime) {
            console.log('车牌号:', car.num);
            console.log('停车时间:', Date.now = inTime)
        }
    }
    
    // 停车场
    class Park {
        constructor(floors) {
            this.floors = floors || []
            this.camera = new Camera();
            this.screen = new Screen();
            this.carList = {} // 存储摄像头拍摄返回的信息
        }
        in(car) {
            // 通过摄像头获取信息
            const info = this.camera.shot(car);
            // 停到某个停车位
            const i = parseInt(Math.random() * 100 % 100);
            const place = this.floors[0].places[i];
            place.in();
            info.place = place;
            //记录信息
            this.carList[car.num] = info;
        }
        out(car) {
            // 获取信息
            const info = this.carList[car.num];
            // 将停车位清空
            const place = info.place;
            place.out();
            // 显示时间
            this.screen.show(car, info.inTime);
            // 清空记录
            delete this.carList[car.num]
        }
        emptyNum() {
            return this.floors.map(floor => {
                return `${floor.index}层还有${floor.emptyPlaceNum()}个空闲车位`
            }).join('
    ')
        }
    }
    
    class Floor {
        constructor(index, places) {
            this.index = index;
            this.places = places || []
        }
        emptyPlaceNum() {
            let num = 0;
            this.places.forEach(p=>{
                if(p.empty){
                    num = num + 1;
                }
            })
            return num;
        }
    }
    
    class Place {
        constructor() {
            this.empty = true;
        }
        in() {
            this.empty = false;
        }
        out() {
            this.empty = true;
        }
    }
    
    // 测试
    // 初始化停车场
    const floors = [];
    for (let i=0; i<3; i++) {
        const places = [];
        for (let j=0; j<100; j++) {
            places[j] = new Place();
        }
        floors[i] = new Floor(i+1, places);
    }
    const park = new Park(floors);
    
    // 初始化车辆
    const car1 = new Car(100);
    const car2 = new Car(200);
    const car3 = new Car(300);
    
    console.log('第一辆车进入');
    console.log(park.emptyNum());
    park.in(car1);
    
    console.log('第儿辆车进入');
    console.log(park.emptyNum());
    park.in(car2);
    
    console.log('第一辆车离开');
    console.log(park.emptyNum());
    park.out(car1);
    
    console.log('第二辆车离开');
    console.log(park.emptyNum());
    park.out(car2);
    
    console.log('第三辆车进入');
    console.log(park.emptyNum());
    park.in(car3);
    console.log('第三辆车离开');
    console.log(park.emptyNum());
    park.out(car3);
  • 相关阅读:
    FreeSWITCH一些需求应对
    CentOS 7安装Mysql并设置开机自启动
    RTP学习笔记
    SDP学习笔记
    Quartz实用二三事
    Quartz:ERROR threw an unhandled Exception
    CentOS 7一些常用配置
    Java获取音频文件(MP3)的播放时长
    使用Callable和Future接口创建线程
    join() 方法详解及应用场景
  • 原文地址:https://www.cnblogs.com/wzndkj/p/11750775.html
Copyright © 2020-2023  润新知