amazon 设计 12 elevator

『设计电梯类』,每个人对于电梯都有一个具体的认知,但面试者自己的理解是否就和面试官一致呢?避免想当然的去假设,多问问题,明确细节,比如:


  • 电梯的容量(载重,载入数)是否考虑?
  • 电梯的运行范围是几层到几层?
  • 是一部电梯还是多个电梯?


当我们相对了解题目的具体需求之后,设计电梯类时要从OO设计基本原则入手,比如封装性,本质上就是讲class内部的状态封装在内,对外提供合理的方法接口。


从方法的角度思考相对直观:根据题目的需求,一个基本的电梯类应该提供什么样的方法呢?


  • 开门、关门
  • 移动到下一目标楼层
  • 接受去目标楼层的请求


以上都是最直观、最基本的方法,相对应的就是电梯内部的基本状态:


  • 电梯门的开关状态 (开关门会影响该状态)
    • 运行方向(移动会影响该状态,该状态也影响下一步行动);
    • 当前楼层 (移动会影响该状态,该状态也影响下一步行动)
    • 需要停的楼层集合(接受去某楼层的请求会影响该状态,该状态影响下一步行动);
    •  







--You can't design everything during the system. You need to show all operation and implement one. For example /* ------------------------ Elevator System ------------------------ Use Cases : 1. Passanger/User wants to go to the different floor. 2. He request the floor number in the elevator system 3. Elevator picks the person 4. Elevator delivers the person to the floor. ----------------- What if elevator is running ? -> If it is going to the same direction, it will pick the person on its way -> If it is open state, it will wait to get it running state -> If elevator is in halt/maintainance state, it will not respond -> If it is waiting state, it will start moving. ------------------ Alternate usecases---- -> Elevator has a maximum number of floor. -> A user can request for call, alarm, stop, keep door open/close such commands -> Elevator has preferrences like door will keep open for 5 seconds for loading or unloading. ------------------ Let's find out the classes, attribute and datastructure by doing language analysis --------------------------------------------------------------------------------- 1. Passanger -> srcFloor -> destinationFloor *issueRequest(int dest) *issueAlarm() *issueStop() 2. Elevator -> state -> direction -> speed -> targetted Floors *openDoor() *moveUp() *moveDown() *stop() *startAlarm() 3. State (Enum) -> Running, Open, Idle, Stopped, Alarmed 4. Floor -> number -> isServiced -------------------------------------------------------------------------------------- Command Pattern ( How Elevator will listen to request ) -------------------------------------------------------------------------------------- /* / class Elevator{ State currState; int directon; int speed; Floor[] targettedFloors; void openDoor() { //Implementation of open door } void closeDoor() { //Implementation of closing door } } interface Request { boolean execute(Elevator e); } class DoorOpenRequest implements Request{ public boolean execute(Elevator e) { e.openDoor(); } } class CloseDoorRequest implements Request{ public boolean execute(Elevator e) { e.closecloseDoor(); } } --- If passanger wants to issue request Command odCommand = new OpenDoorCommand(Elevator.getInstance()); odCommand.execute();

 

posted on 2014-11-14 05:24  brave_bo  阅读(3056)  评论(0编辑  收藏  举报

导航