我正在尝试学习设计实践和OOP。我正在使用 parking 场问题作为示例。

我有一个GeneralParkingLot接口(interface)和一个Vehicle接口(interface)。
GeneralParkingLot只有一个函数returnParkingLotSizeVehicle接口(interface)具有多个Vehicle属性。

我创建了一个DowntownParkingLot类,它扩展了GeneralParkingLot并具有其他属性,例如listOfCarsavailableSlots等,以及一个Car类,它扩展了Vehicle类。

我有一个处理传入命令的HandlerClass,在该类中我声明了一个DownTownParkingLot对象和多个函数来处理命令,因此在每个函数中,我只传递DowntownParkingLot对象并对其进行操作。

我创建了不同的服务,例如CreateParkingLotObjectParkACarFreeASlot等,这些服务由命令处理程序调用。

我还创建了单元测试来测试我的应用程序。

我的问题是,如果我想扩展当前的 parking 场以具有其他功能,比如说多楼层属性,或者如果我现在要处理多个 parking 场而不是一个,那么扩展我的GeneralParkingLot类或DowntownParkingLot的最佳方法是什么?类(class)。我还阅读了有关适配器和装饰器模式的信息,但是当我从一开始就遵循特定的设计模式时,我认为它们很有用。就我而言,我没有遵循任何特定的模式,因此扩展代码的最佳方法是什么。我之所以这样问,是因为有时我们遇到的类不是根据任何设计模式制作的,而是在多个地方使用(例如许多API等),因此扩展此类代码的最佳方法是什么。从开始重构是唯一的选择吗?或创建从旧类继承的新类?最好的方法是什么?我也想尽可能地使用已经创建的单元测试,而不是再次重写相同的测试用例。

最佳答案

在您的情况下,最高级的类是接口(interface),因此您不能直接添加属性。

解决您的问题的一种方法是创建一个最高级的实现类,该类实现GeneralParkingLot接口(interface):

public abstract CommonParkingLot implements GeneralParkingLot {
     // add your missing attributes here
     protected int floorNo;
}

(如果您只想添加属性而不提供GeneralParkingLot的某些默认实现,则可以省略implements部分)

然后让您的实现类扩展此CommonParkingLot:
public class DowntownParkingLot extends CommonParkingLot implement GeneralParkingLot {
     // Now all missing attributes are accessible here
}

对于缺少的功能,default函数接口(interface)应该很方便。 (关键字是指定的语言),您可以根据需要向GeneralParkingLot接口(interface)添加更多功能,并为其使用默认主体。

还有一点,您当前的实现有点受限于DowntownParkingLot,因为您没有向接口(interface)添加通用功能。我建议您稍微重构HandlerClass类:
public interface GeneralParkingLot {
    int returnParkingLotSize();
    ParkingLotObject createParkingLotObject();
    boolean parkACar();
    int freeASlot();
    default public void parkMultipleCar() {
         throws new UnsupportedOperationException();
    }
}

现在,您的HandlerClass应该在GeneralParkingLot而不是DowntownParkingLot上进行操作。

这样,您可以添加更多的GeneralParkingLot而无需更改代码。

10-06 13:06