我有一个GeneralParkingLot接口和一个Vehicle接口.
GeneralParkingLot只有一个函数returnParkingLotSize,Vehicle接口有多个Vehicle属性.
我创建了一个类UrbanParkingLot,它扩展了GeneralParkingLot并具有其他属性,如listOfCars,availableSlots等,以及一个扩展Vehicle类的Car Class.
我有一个处理传入命令的HandlerClass,在该类中我已经使用了一个DownTownParkingLot对象和多个函数来处理命令,因此在每个函数中我只传递DowntownParkingLot的对象并对其进行操作.
我已经创建了不同的服务,如CreateParkingLotObject,ParkACar,FreeASlot等,它们由命令处理程序调用.
我还创建了单元测试来测试我的应用程序.
我的问题是,如果我想扩展我目前的停车场以获得额外的功能,例如让我们说多个楼层属性或者如果我现在要处理多个停车场而不是一个,那么扩展我的GeneralParkingLot类或DowntownParkingLot的最佳方式是什么类.我也读过关于适配器和装饰器模式的内容,但是我认为当我从开始就遵循特定的设计模式时这些是有用的.在我的情况下,我没有遵循任何特定的模式,所以什么是扩展我的代码的最佳方式.我问这个是因为有时我们会遇到一个不是根据任何设计模式制作并且在多个地方使用的类(比如许多API等),所以扩展这样的代码的最佳方法是什么.从重启开始是唯一的选择吗?或者创建从旧类继承的新类?什么是最好的方式?另外,我想尽可能多地使用已经创建的单元测试,而不是再次重写相同的测试用例.
解决方法
解决问题的一种方法是创建一个实现GeneralParkingLot接口的最顶层实现类:
public abstract CommonParkingLot implements GeneralParkingLot { // add your missing attributes here protected int floorNo; }
(如果您只想添加属性而不为GeneralParkingLot提供一些默认实现,那么您可以省略实现部分)
然后让您的实现类扩展此CommonParkingLot:
public class DowntownParkingLot extends CommonParkingLot implement GeneralParkingLot { // Now all missing attributes are accessible here }
对于缺少的功能,默认的功能界面应该派上用场. (关键字是指定的语言),您可以根据需要向GeneralParkingLot接口添加更多功能,并为其添加默认主体.
还有一点,您当前的实现仅限于DowntownParkingLot,因为您没有为界面添加常用功能.我建议你稍微重构一下HandlerClass类:
public interface GeneralParkingLot { int returnParkingLotSize(); ParkingLotObject createParkingLotObject(); boolean parkACar(); int freeASlot(); default public void parkMultipleCar() { throws new UnsupportedOperationException(); } }
现在你的HandlerClass应该在GeneralParkingLot而不是DowntownParkingLot上运行.