【发布时间】:2018-11-23 04:23:41
【问题描述】:
我正在努力学习设计实践和 OOP。我以停车场问题为例开始。
我有一个GeneralParkingLot 接口和一个Vehicle 接口。
GeneralParkingLot只有一个功能returnParkingLotSize,Vehicle接口有多个Vehicle属性。
我创建了一个类 DowntownParkingLot,它扩展了 GeneralParkingLot 并具有其他属性,例如 listOfCars、availableSlots 等,以及一个扩展了 Vehicle 类的 Car 类。
我有一个处理传入命令的HandlerClass,在该类中我已经声明了一个DownTownParkingLot 对象和多个函数来处理命令,所以在每个函数中我只传递DowntownParkingLot 的对象并对其进行操作。
我创建了不同的服务,例如CreateParkingLotObject、ParkACar、FreeASlot 等,这些服务由命令处理程序调用。
我还创建了单元测试来测试我的应用程序。
我的问题是,如果我想扩展我当前的停车场以具有额外的功能,比如让我们说多个楼层属性,或者如果我现在想处理多个停车场而不是一个,那么扩展我的 @ 的最佳方法是什么? 987654338@类或DowntownParkingLot类。我还阅读了有关适配器和装饰器模式的信息,但我认为当我从一开始就已经遵循特定的设计模式时,这些很有用,在我的情况下,我没有遵循任何特定的模式,那么扩展我的代码的最佳方法是什么。我问这个是因为有时我们会遇到一个不是根据任何设计模式制作的类并且在多个地方使用(比如很多 API 等),那么扩展此类代码的最佳方法是什么。从头开始重构是唯一的选择吗?或创建从旧类继承的新类?最好的方法是什么?另外我想尽可能多地使用已经创建的单元测试,而不是再次重写相同的测试用例。
【问题讨论】:
-
因为你有一个
extends链,你必须决定新属性应该放在哪个位置。使用multiple floor attribute将其添加到GeneralParkingLot是最有意义的,因为(至少在理论上)每个丢失的停车位都可能有多个楼层,而不仅仅是DowntownParkingLots。如果您无法更改该类,则创建一个扩展GeneralParkingLot的新“超级”类。现在您的所有类都可以扩展新的“超级”类并包含所有信息。希望我正确理解了您的问题 -
如果我将楼层添加到
GeneralParkingLot那么要实现它应该创建一个新类还是在旧类中实现?考虑到将来还可以添加更多功能,我不知道哪个会更好。我也不想打扰当前的功能 -
此外,它不仅没有添加地板,我还想知道在这种情况下我们如何扩展代码的一般想法?
-
不要让它成为一个接口。让它成为
abstract class(甚至只是一个普通的类。取决于用例)。如果您只有要公开的方法,而不是任何字段,则应使用接口 -
您使用相同的
DowntownParkingLot。但是您必须检查每个扩展类是否真的应该具有该属性,并且只有在这种情况下,您才能将该字段添加到抽象类
标签: java oop inheritance design-patterns interface