题目描述:
软件框架:
ADT设计:
- 静态工厂方法
/**
* 创建一个新的停车场
*
* @param nos 各停车位的编号,均为自然数,且无重复
* @param widths 各停车位的宽度,包含的元素数量=nos中元素数量 且>=5
* @return 一个停车场对象,包含了widths.length个车位,各车位的宽度与nos中相应数字一致,且各车位上均未有停车
* @throws 如果违反nos和widths不合法
*/
public static ParkingField create(int[] nos, int[] widths) throws Exception {
return new ConcreteParkingField(nos, widths);
}
创建一个新的停车场。
- 停车:
/**
* 在某个停车位上停车
* 车牌号为plate的车辆,之前没停在车场,执行后停在了车位号为num的车位上,该车位宽度大于车宽度
* 其他车位的状态不变
*
* @param plate 要停进来的车辆车牌号,not null
* @param width 车的宽度,自然数
* @param num 指定的停车位编号,自然数
* @throws 如果plate车已经停在该停车场,或者num车位已被其他车占用,或者num车位宽度不超过width,或者num并不是合法车位
*/
public void parking(String type, String plate, int width, int num, String[] extraRegistrationInfo) throws Exception;
- 驶离停车场:
/**
* 将汽车驶离停车场,plate车原来占用的车位空出来了,计算出本次停车的费用(半小时10元,不足半小时按半小时计算)
*
* @param plate 待驶离的车辆,not null
* @return 本次停车的费用(精确计算得到)
* @throws plate车并没有停在本车场
*/
public double depart(String plate) throws Exception;
- 停车场状态:
/**
* 返回当前停车场每个车位的状态(空,或被某车占用)
*
* @return Key为停车位的编号,Value为该车位上的车辆车牌号。如果停车位上无车辆,则对应的Value为“”
*/
public Map<Integer, String> status();
以上是核心方法,其他辅助性的方法不再说明。
方法的实现都十分简单,并不是软件构造课的主要内容,故对其逻辑不一一说明。
面向复用的设计:
相机场等,本质上和停车场的功能完全一样,所以我们设计的ADT如果有很好的复用性的话,只需经过少量的扩展,就可以实现一个更加复杂的场景下的类。
- 我们首先将Car扩展成Parkable,