用面向对象的系统分析模拟电梯

当涉及到面向对象设计和分析时,有一系列的问题似乎在面试和课堂上很常用。这是其中之一; 不幸的是,我在大学的 OOP 教授从来没有给出一个实际的答案,所以我一直想知道。

问题如下: 设计一组用于模拟电梯库的基本对象/方法。什么是对象及其属性/方法?

为了便于讨论,让我们假设我们的建筑物有20层; 底层是大厅,二层连接到停车场(因此,人们将进出建筑物的底层或二层)。有一个电梯银行服务的所有楼层,有三个电梯轴在电梯银行,和一个电梯轴。

在面向对象模型中建模的正确方法是什么?

147240 次浏览

我见过这个问题的许多变体。其中一个主要的区别(这决定了难度)是是否有一些集中的尝试,有一个“智能和有效的系统”,将负载平衡(例如,派更多的空闲电梯在早上游说)。如果是这种情况,设计将包括一个真正有趣的设计整个子系统。

一个完整的设计显然是太多,在这里提出,有许多替代方案。宽度也不清楚。在面试中,他们会试图弄清楚你会怎么想。然而,以下是你需要的一些东西:

  1. 中央控制器的表示形式(假设有一个中央控制器)。

  2. 电梯表示法

  3. 电梯的接口单元的表示形式(这些可能与 电梯到电梯)。显然也呼叫每层楼上的按钮等

  4. 每层楼上箭头或指示器的表示(几乎是电梯模型的“视图”)。

  5. 人和货物的表示(对于分解最大载荷可能很重要)

  6. 建筑物的表现形式(在某些情况下,某些楼层有时可能被堵塞,等等)

首先有一个电梯类。它有一个方向(向上、向下、站立、维护)、当前楼层和按方向排序的楼层请求列表。它接收来自这部电梯的请求。

还有一家银行。它包含电梯和接收来自楼层的请求。这些都安排在所有运行中的电梯(不在维护中)。

日程安排会是这样的:

  • 如果可以的话,在这层楼选一个站式电梯。
  • 要不然就选一部到这层楼的电梯。
  • 或者选择其他楼层的固定电梯。
  • 其他人选择负荷最低的电梯。

每个电梯都有一组状态。

  • 维护: 电梯不对外部信号作出反应(只对自身信号作出反应)。
  • 站立: 电梯固定在一个楼层上。如果它接到电话。电梯在那一层,门是开着的。如果它在另一层,它就朝那个方向移动。
  • 向上: 电梯向上移动。每到达一层楼,它就检查是否需要停车。如果是这样,它就会停下来,打开门。它会等待一段时间,然后关上门(除非有什么东西正在穿过它们)。然后,它从请求列表中删除发言,并检查是否存在另一个请求。如果是这样的话,电梯又开始运行了。如果没有,它进入国家的立场。
  • 向上,向下,向上,向相反的方向。

还有其他信号:

  • 警报。电梯停了。如果是在地板上,门打开,请求清单被清除,请求被移回银行。
  • 电梯门打开。如果电梯在地板上并且没有移动,电梯门就打开。
  • 门关上,如果门开着就关上。

编辑: 有些电梯不从底层开始,尤其是摩天大楼。

Min _ floor 和 max _ floor 是电梯的两个附加属性。

Donald Knuth 的《计算机编程的艺术》第1卷有一个关于电梯和数据结构的演示。Knuth 提供了一个非常全面的讨论和节目。

Knuth (1997)“信息结构”,计算机编程艺术 Vol. 1 第302-308页

参见:

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 ())。这会使问题变得太复杂。我试着把它写在纸上,但不认为它工作。在这里,我们似乎并不需要考虑并发性或计时问题,但是我们确实需要以某种方式使用队列来分发控件。

有什么建议吗?