s**9 发帖数: 207 | 1 电梯design的问题经常在Amazon的面试中出现。在版上和网上搜了一圈,没有看到比较
完整的解答。一直不清楚回答这种问题应该体现一个什么样的思路。试着做了一下,请
大家给些意见。
分析:
1. 电梯至少要处理两个事件,乘客按电钮是一个事件,电梯到达某层楼是一个事件。
每个事件发生时,电梯应当做相应的操作。
2. 电梯的操作不单取决于事件,还依赖电梯的状态,状态包括任务列表(需要去的楼
层)和运行状态(上行、下行)。
3。按电钮和到达某层的事件可以是同时的,电梯应提供互斥机制保护shared resource。
设计:
class Elevator{
pubic:
buttonPushed(int source, int destination);//source层有人要去destination层
levelArrived(int level);//level层到了
private:
stop(); //停
up(); //上行
down(); //下行
mutex;
taskList;
stat |
s*********t 发帖数: 1663 | 2 ding
完全没有面向对象的经验
resource。
【在 s**9 的大作中提到】 : 电梯design的问题经常在Amazon的面试中出现。在版上和网上搜了一圈,没有看到比较 : 完整的解答。一直不清楚回答这种问题应该体现一个什么样的思路。试着做了一下,请 : 大家给些意见。 : 分析: : 1. 电梯至少要处理两个事件,乘客按电钮是一个事件,电梯到达某层楼是一个事件。 : 每个事件发生时,电梯应当做相应的操作。 : 2. 电梯的操作不单取决于事件,还依赖电梯的状态,状态包括任务列表(需要去的楼 : 层)和运行状态(上行、下行)。 : 3。按电钮和到达某层的事件可以是同时的,电梯应提供互斥机制保护shared resource。 : 设计:
|
s******i 发帖数: 44 | 3 可以参考这个http://stackoverflow.com/questions/493276/modelling-an-elevator-using-object-oriented-analysis-and-design
我觉得需要有一个类似elevator bank之类的central control,因为这里有两个
elevator,也可以更多。
至于消息传递和设计模式,我觉得
1. Button informs bank (Observer pattern)
2. bank makes decision
3. dispatches message to best elevator (Message Dispatcher pattern) |
s**9 发帖数: 207 | 4 我是觉得这些解答没有考虑一个问题。考虑下面的场景:
乘客在1楼进电梯,按10楼。走到3楼,5楼有乘客按电梯。电梯停5楼,乘客上电梯,按
7楼。电梯继续上7楼,停,再到10楼。
假设电梯提供一个moveToFloor(int destination)的函数。在上面的场景中,设电梯在
1楼,bank调用elevator1.moveToFloor(10)。 moveToFloor(10)不能等电梯到了10楼
才返回,否则电梯不能停5楼。所以moveToFloor(10)应该给电梯设一个去10楼的任务,
把电梯设成向上运动,然后返回。这样就有一个问题,到了10楼谁来停电梯?我想的就
是除了buttonPush的事件,还应该有一个levelArrived事件,每到一层楼,该事件触发
一次,就是elevator提供一个levelArried(int)函数,每到一层楼,该函数被调用一
次。
我一开始假设单电梯的情况,没有bank,只有电梯和乘客,所以对怎么调用这个
levelArried函数有些问题。加上bank,由bank来调用levelArried,看起来就通顺了。
这个Message Disp
【在 s******i 的大作中提到】 : 可以参考这个http://stackoverflow.com/questions/493276/modelling-an-elevator-using-object-oriented-analysis-and-design : 我觉得需要有一个类似elevator bank之类的central control,因为这里有两个 : elevator,也可以更多。 : 至于消息传递和设计模式,我觉得 : 1. Button informs bank (Observer pattern) : 2. bank makes decision : 3. dispatches message to best elevator (Message Dispatcher pattern)
|
s******i 发帖数: 44 | 5 Message Dispatcher pattern不一定是一个严格意义上的pattern。当然任何人都可以
定义和实现自己设计的pattern。
基本的思路就是有一个message receiver pool,但是一个message只能给一个特定的
receiver,而不是像observer pattern那样broadcast给每一个receiver。每一个
receiver需要注册到这个pool以接收消息。可以理解为1:1的observer pattern而不是1 |
f****4 发帖数: 1359 | 6 虽然我没给amz问到这个问题,但是要是我来回答,我会告诉他depends
1.如果只有1台电梯,就非常简单,电梯分停,上行,下行3个状态;电梯内外按钮优先
级一样,根据停,上下行来处理;处理开关门;处理故障(如果电梯出故障了,怎么办
,故障时电梯门要维持开着等等)
2.如果要多台电梯同时运行,一个控制类;n台电梯。控制类用消息队列来控制各个电
梯;电梯可以再增加;内部按钮是这台电梯必须实现的请求;外部按钮只是把请求发到
控制类,由控制类来调度合适的电梯完成请求;各台电梯上下行,停3个状态;电梯提
供状态查询给控制类(上行还是下行,上行最大楼层/下行最低楼层;停在第几楼);最
后提供故障处理
这类问题没有具体环境;这样就需要你先来进行假设,然后再做设计
并且你的设计只要够用就好,比如只有1台电梯,就没必要弄那么复杂 |