我正在尝试学习设计实践和OOP。我正在使用 parking 场问题作为示例。
我有一个GeneralParkingLot
接口(interface)和一个Vehicle
接口(interface)。
GeneralParkingLot
只有一个函数returnParkingLotSize
,Vehicle
接口(interface)具有多个Vehicle属性。
我创建了一个DowntownParkingLot
类,它扩展了GeneralParkingLot
并具有其他属性,例如listOfCars
,availableSlots
等,以及一个Car
类,它扩展了Vehicle
类。
我有一个处理传入命令的HandlerClass
,在该类中我声明了一个DownTownParkingLot
对象和多个函数来处理命令,因此在每个函数中,我只传递DowntownParkingLot
对象并对其进行操作。
我创建了不同的服务,例如CreateParkingLotObject
,ParkACar
,FreeASlot
等,这些服务由命令处理程序调用。
我还创建了单元测试来测试我的应用程序。
我的问题是,如果我想扩展当前的 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
而无需更改代码。