当涉及到面向对象设计和分析时,有一系列的问题似乎在面试和课堂上很常用。这是其中之一; 不幸的是,我在大学的 OOP 教授从来没有给出一个实际的答案,所以我一直想知道。
问题如下: 设计一组用于模拟电梯库的基本对象/方法。什么是对象及其属性/方法?
为了便于讨论,让我们假设我们的建筑物有20层; 底层是大厅,二层连接到停车场(因此,人们将进出建筑物的底层或二层)。有一个电梯银行服务的所有楼层,有三个电梯轴在电梯银行,和一个电梯轴。
在面向对象模型中建模的正确方法是什么?
我见过这个问题的许多变体。其中一个主要的区别(这决定了难度)是是否有一些集中的尝试,有一个“智能和有效的系统”,将负载平衡(例如,派更多的空闲电梯在早上游说)。如果是这种情况,设计将包括一个真正有趣的设计整个子系统。
一个完整的设计显然是太多,在这里提出,有许多替代方案。宽度也不清楚。在面试中,他们会试图弄清楚你会怎么想。然而,以下是你需要的一些东西:
中央控制器的表示形式(假设有一个中央控制器)。
电梯表示法
电梯的接口单元的表示形式(这些可能与 电梯到电梯)。显然也呼叫每层楼上的按钮等
每层楼上箭头或指示器的表示(几乎是电梯模型的“视图”)。
人和货物的表示(对于分解最大载荷可能很重要)
建筑物的表现形式(在某些情况下,某些楼层有时可能被堵塞,等等)
首先有一个电梯类。它有一个方向(向上、向下、站立、维护)、当前楼层和按方向排序的楼层请求列表。它接收来自这部电梯的请求。
还有一家银行。它包含电梯和接收来自楼层的请求。这些都安排在所有运行中的电梯(不在维护中)。
日程安排会是这样的:
每个电梯都有一组状态。
还有其他信号:
编辑: 有些电梯不从底层开始,尤其是摩天大楼。
Min _ floor 和 max _ floor 是电梯的两个附加属性。
Donald Knuth 的《计算机编程的艺术》第1卷有一个关于电梯和数据结构的演示。Knuth 提供了一个非常全面的讨论和节目。
Knuth (1997)“信息结构”,计算机编程艺术 Vol. 1 第302-308页
详细答案:
Http://www.angelfire.com/trek/software/elevator.html
参见:
Lu Luo, A UML Documentation for a Elevator System Distributed Embedded Systems, Fall 2000 Ph.D. Project Report Carneghie Mellon University
链接
当 设计电梯系统,
Elevator Floor/Location Identifier Number of steps Rotation speed Daterange InstallationDate MaintainenceDate Department Identifier AllowedWeight Detail / Description Poison Ratio (Statistics) Start Stop SetDirection SetRotationSpeed EmergencyStop = Stop + Alert EmergencyAccidentSenser Handler
按下每个按钮都会产生一个电梯请求,这个请求必须被提供。每个请求都在全局位置进行跟踪
大楼的升降机数目将由使用者决定。这座建筑将包含一个固定的地上层数。可以坐进电梯的乘客人数将是固定的。乘客在离开目的楼层的电梯时将被计算在内。目标楼层将使用“随机”泊松区间确定。当电梯里的所有乘客都到达目的楼层时,电梯将返回大厅接更多的乘客
主要的问题是你如何通知电梯它需要向上或向下移动。还有,如果你要有一个集中的类来控制这种行为,以及如何分发控件。
看起来可以很简单,也可以很复杂。如果我们不采取并发或时间为电梯到达一个地方,那么它似乎将是简单的,因为我们只需要检查电梯的状态,如它是向上移动或向下,或静止。但是,如果我们使电梯实现 Runnable,并不断检查和同步队列(linkedList)。Controller 类将分配到队列中的哪一层。当队列为空时,run ()方法将等待(queue e.wait ()) ,当一个地板被分配给这个升降机时,它将调用 queue e.tification ()来唤醒 run ()方法,run ()方法将调用 goTofloor (queue e.pop ())。这会使问题变得太复杂。我试着把它写在纸上,但不认为它工作。在这里,我们似乎并不需要考虑并发性或计时问题,但是我们确实需要以某种方式使用队列来分发控件。
有什么建议吗?