【问题标题】:Object Oriented Design of a parking lot面向对象的停车场设计
【发布时间】:2014-09-25 00:04:50
【问题描述】:

在学习面试时,我想到了这个问题。 我打算设计一个停车场,我假设以下几点:

  1. 它有多个级别。每个级别有 2 行。
  2. 车辆类型可以是小型、紧凑和大型。
  3. 某一层的每一行都有多个停车位。
  4. 每个停车位都有红/绿指示灯(红色-无车位,绿色-无车位)
  5. 此外,每个停车位的尺寸都将是小、紧凑和大。

6(可选)。还要加残疾人情况。

这些是我可以提出的一些假设(不确定它们是否足够或我需要更多)。

我正在考虑以这样一种方式设计系统,即一旦车辆进入停车场入口。

他应该被告知最近的空位在哪里(例如——第 3 层,第 2 行,第 10 号位置)

我想知道如何设计这样一个系统?我见过很多其他的设计,但我猜没有一个能做到这一点。

【问题讨论】:

  • 我不明白为什么它不可能。那是你的问题吗?是否可以根据存储的数据进行计算?你到底在问什么?
  • 我想知道我们将如何设计这样一个系统。
  • 这对于 Stack Overflow 问题来说非常广泛。如果您尝试设计它并遇到特定问题,我们很乐意提供帮助。但是“我该如何实现呢?”问题通常过于宽泛。

标签: class oop object inheritance


【解决方案1】:

不确定您希望通过第 6 点实现什么,但其余部分通过通常的抽象、继承和多态原则通过 OO 设计很容易实现。

您可以有一个名为AvailabilityIndicatorinterface,它有一个布尔方法isAvailable(),它表示指示灯(如果isAvailable()false,灯泡将显示红色,如果true 则显示绿色) .

您可以拥有一个名为ParkingSlotabstract class,它实现了AvailabilityIndicator。 这可能包含级别、行和点号。

您可以拥有 3 个类 LargeParkingSlotCompactParkingSlotSmallParkingSlot,它们扩展了 ParkingSlot。 (并不是说你的功能实际上需要这个,除非不同的停车位有不同的行为或你想要建模的数据,但是因为你提到你想要一个 OO 方法我提到了它,否则ParkingSlot 中的一个简单的slotType 参数会做.)

然后是车辆何时到达的问题,检查它需要什么类型的插槽并查找哪些是匹配的可用插槽。您可能希望将它们放入 Map 数据结构中,该数据结构将每个插槽类型映射到可用插槽类型的列表,以便在使用时将其删除并放入单独的 unavailable 列表中,以便快速查找 @987654338 @ 车辆到达时的插槽。

【讨论】:

  • 这几乎回答了这个问题。谢谢你。关于第 6 点,我的意思是我们还可以为残疾人提供单独的停车选择(就像许多国家所做的那样)。
  • 是的,但这取决于它有什么特别之处。它会是另一个与 large/compact/small 不同的插槽(即再次扩展 ParkingSlot 吗?它会是 large/compact/small 的单独属性(即您可以禁用 large、禁用紧凑、禁用 small)?在这种情况下,您可能需要在ParkingSlot 类中设置一个单独的标志,并将可用的残疾人标志保存在单独的Map 中,以便在残疾人到达时,以防所有其他人都被带走。您是否有此插槽的特殊行为,在这种情况下,您可能需要不同的 OO 设计模式?
  • 理想情况下,我要做的是分配特定的停车位(每个楼层靠近电梯)作为指定的残疾人停车位,当残疾人进入运行相同的程序时(只需有一个标志和残疾人可用停车位的单独地图)。对于一般人来说,我会确保我的地图上的所有其他停车位都不在任何指定的残疾人停车位中。听起来不错?只是和你讨论。
  • 是的,所以handicapped 标志可以进入ParkingSlot 类。然后在创建所有停车位时(取决于停车场),您希望残疾人更容易进入的停车位将此标志设置为true 并插入不同的ListMap。然后,当残疾人到达时,您首先查看特殊插槽ListMap,然后再给他一个普通插槽(如果没有handicapped=true 可用),而普通人只会从正常插槽中获得一个插槽。
  • 如果我们维护两个列表availableSlotstakenSlots,那么我们真的不需要Slot 类上的isAvailable 方法,对吗?那会是一个糟糕的设计吗?保留两个列表也有助于快速搜索,例如,如果 availableSlots 为空,则任何楼层都没有可用的插槽。另外,AvailabilityIndicator 接口的意义何在?还有谁会需要这样的界面?
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多