设计一个OO停车场。它有哪些类和功能?它应该说,满了,空了,还能够找到代客泊车的地方。该停车场有 3 种不同类型的停车位:普通停车位、残疾人停车位和紧凑型停车位。
这是让齿轮转动的快速入门...
ParkingLot 是一个类。
ParkingSpace 是一个类。
停车位有入口。
入口有一个位置,或更具体地说,是距入口的距离。
ParkingLotSign 是一个类。
停车场有停车场标志。
停车场的停车位数量有限。
HandicappedParkingSpace 是 ParkingSpace 的子类。
RegularParkingSpace 是 ParkingSpace 的子类。
CompactParkingSpace 是 ParkingSpace 的子类。
ParkingLot 保留 ParkingSpaces 数组,以及按照距其入口的距离的顺序排列的单独的空闲 ParkingSpaces 数组。
可以通过调用 .Full()、.Empty() 或 .Normal() 来告诉 ParkingLotSign 显示“已满”、“空”或“空白/正常/部分占用”
帕克是一个班级。
帕克可以停车()。
Parker 可以 Unpark()。
Valet 是 Parker 的子类,可以调用 ParkingLot.FindVacantSpaceNearestEntrance(),返回一个 ParkingSpace。
帕克有停车位。
Parker 可以调用 ParkingSpace.Take() 和 ParkingSpace.Vacate()。
Parker 调用 Entrance.Entering() 和 Entrance.Exiting(),ParkingSpace 会在有人或空出时通知 ParkingLot,以便 ParkingLot 确定是否已满。如果它是新满或新空或新未满或空,则应更改 ParkingLotSign.Full() 或 ParkingLotSign.Empty() 或 ParkingLotSign.Normal()。
HandicappedParker 可以是 Parker 的子类,CompactParker 是 Parker 的子类,RegularParker 是 Parker 的子类。 (实际上可能有点矫枉过正。)
在此解决方案中,Parker 可能应重命名为 Car。
public class ParkingLot
{
Vector<ParkingSpace> vacantParkingSpaces = null;
Vector<ParkingSpace> fullParkingSpaces = null;
int parkingSpaceCount = 0;
boolean isFull;
boolean isEmpty;
ParkingSpace findNearestVacant(ParkingType type)
{
Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();
while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();
if(parkingSpace.parkingType == type)
{
return parkingSpace;
}
}
return null;
}
void parkVehicle(ParkingType type, Vehicle vehicle)
{
if(!isFull())
{
ParkingSpace parkingSpace = findNearestVacant(type);
if(parkingSpace != null)
{
parkingSpace.vehicle = vehicle;
parkingSpace.isVacant = false;
vacantParkingSpaces.remove(parkingSpace);
fullParkingSpaces.add(parkingSpace);
if(fullParkingSpaces.size() == parkingSpaceCount)
isFull = true;
isEmpty = false;
}
}
}
void releaseVehicle(Vehicle vehicle)
{
if(!isEmpty())
{
Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();
while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();
if(parkingSpace.vehicle.equals(vehicle))
{
fullParkingSpaces.remove(parkingSpace);
vacantParkingSpaces.add(parkingSpace);
parkingSpace.isVacant = true;
parkingSpace.vehicle = null;
if(vacantParkingSpaces.size() == parkingSpaceCount)
isEmpty = true;
isFull = false;
}
}
}
}
boolean isFull()
{
return isFull;
}
boolean isEmpty()
{
return isEmpty;
}
}
public class ParkingSpace
{
boolean isVacant;
Vehicle vehicle;
ParkingType parkingType;
int distance;
}
public class Vehicle
{
int num;
}
public enum ParkingType
{
REGULAR,
HANDICAPPED,
COMPACT,
MAX_PARKING_TYPE,
}
模型并不是孤立存在的。您为模拟汽车进入停车场、引导您进入空闲空间的嵌入式系统、停车场计费系统或停车场常见的自动门/售票机定义的结构都是不同的。
在面向对象的停车场中,不需要服务员,因为汽车会“知道如何停车”。
在停车场找到一辆可用的汽车会很困难;最常见的模型要么将所有移动部件暴露为公共成员变量,要么它们将是没有门窗的“完全封装”汽车。
我们 OO 停车场的停车位与汽车的尺寸和形状不匹配(停车位与汽车之间的“阻抗不匹配”)
我们批次上的许可证标签的每个字母和数字之间都有一个点。残疾人停车位仅适用于以“_”开头的驾照,以“m_”开头的驾照将被拖走。
您需要一个停车场,其中包含“空间”类型的多维数组(在构造函数中指定)。停车场可以通过调用填充和清空空间的函数来跟踪占用了多少空间。Space 可以保存一个枚举类型,告诉它是什么类型的空间。 Space 还有一个 take() 方法。对于代客泊车,只需找到第一个空位并将汽车停在那里即可。您还需要一个 Car 对象来放置在该空间中,该对象可以容纳它是残疾车辆、紧凑型车辆还是普通车辆。
class ParkingLot
{
Space[][] spaces;
ParkingLot(wide, long); // constructor
FindOpenSpace(TypeOfCar); // find first open space where type matches
}
enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };
class Space
{
TypeOfSpace type;
bool empty;
// gets and sets here
// make sure car type
}
class car
{
TypeOfCar type;
}