js 设计模式面试题之停车场

2021-1-29 Jon js+jquery+ajax

题目

某停车场,分3层,每层100车位
每个车位都能监控到车辆的驶入和离开
车辆进入前,显示每层的空余车位数
车辆进入时,摄像头可识别车牌号和时间
车辆出来时,出口显示器显示车牌号和停车时长
画出UML类图 用ES6语法写出该示例

解答
  1. UML 类图

  2. 代码演示

   js    119行
// 摄像头
class Camera {
  shot(car) {
    // 返回车牌号和进入时间
    return {
      num: car.num,
      inTime: new Date()
    }
  }
}
// 出口显示屏
class Screen {
  show(car, inTime) {
    console.log(`车辆 ${car.num}`, '停车时长是 '+ ((new Date() - inTime)/1000) +'秒')
  }
}
// 车位
class Place {
  constructor(){
    this.empty = true;
  }
  in() {
    this.empty = false;
  }
  out() {
    this.empty = true;
  }
}
// 层
class Floor {
  constructor(index, places){
    this.index = index           // 第几层
    this.places = places || []   // 停车位
  }
  emptyPlaceNum() {
    let num = 0;
    this.places.forEach(p => {
      if(p.empty) {
        num++
      }
    });
    return num;
  }
}
// 停车场
class Park {
  constructor(floors) {
    this.floors = floors || []; // 停车场楼层
    this.camera = new Camera(); // 摄像头实例
    this.screen = new Screen(); // 显示器实例
    this.carList = {}; // 存储摄像头拍摄返回的车辆信息
  }
  showPlaceNum() {
    return this.floors.map(floor => {
      return `${floor.index} 层还有 ${floor.emptyPlaceNum()} 个空闲车位`
    }).join('\n')
  }
  in(car) {
    // 通过摄像头获取信息
    const info = this.camera.shot(car);
    // 停到某个车位
    const i = parseInt(Math.random() * 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];
  }
}
// 车辆
class Car {
  constructor(num) {
    this.num = num   // 车牌号
  }
}

// 测试-----
// 初始化停车场
const floors = [];
// 假设有停车场为三层
for (let i = 0; i < 3; i++) {
  const places = [];
  // 假设每层停车场共有100个停车位
  for (let j = 0; j < 100; j++) {
    // 创建100个停车位
    places.push(new Place())
  }
  // 创建停车场的楼层
  const floor = new Floor(i+1, places);
  floors.push(floor);
}

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.showPlaceNum())
park.in(car1)
console.log('第二辆车进入')
console.log(park.showPlaceNum())
park.in(car2)
setTimeout(() => {
  console.log('第一辆车出去')
  park.out(car1)
}, 5000);

标签: js 面试题 设计模式

分享这篇文章
赞助鼓励:如果觉得内容对您有所帮助,您可以支付宝(左)或微信(右):

声明:如无特殊注明,所有博客文章版权皆属于作者,转载使用时请注明出处。谢谢!

发表评论:

皖ICP备15010162号-1 ©2015-2020 知向前端
qq:1614245331 邮箱:13515678147@163.com Powered by emlog sitemap