使用OOPS扩展已编写的类

Leg*_*ter 7 java oop inheritance design-patterns interface

我正在努力学习设计实践和OOP.我正在使用停车场问题作为样品开始.

我有一个GeneralParkingLot界面和一个Vehicle界面. GeneralParkingLot只有一个功能returnParkingLotSize,Vehicle接口有多个Vehicle属性.

我创建了一个DowntownParkingLot扩展的类,GeneralParkingLot并具有其他属性,如listOfCars,availableSlots等等,以及一个Car扩展Vehicle类的类.

我有一个HandlerClass处理传入命令的内容,在该类中我已经解析了一个DownTownParkingLot对象和多个函数来处理命令,因此在每个函数中我只传递对象DowntownParkingLot并对其进行操作.

我创建了像不同的服务CreateParkingLotObject,ParkACar,FreeASlot等它们由命令处理程序调用.

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

我的问题是,如果我想扩展我目前的停车场以获得额外的功能,例如让我们说多层楼属性或者如果我现在想要处理多个停车场而不是一个停车场,那么扩展我的GeneralParkingLot班级或DowntownParkingLot班级的最佳方式是什么.我也读过关于适配器和装饰器模式的内容,但是我认为当我从开始就遵循特定的设计模式时这些是有用的.在我的情况下,我没有遵循任何特定的模式,所以什么是扩展我的代码的最佳方式.我问这个是因为有时我们会遇到一个不是根据任何设计模式制作并且在多个地方使用的类(比如许多API等),所以扩展这样的代码的最佳方法是什么.从重启开始是唯一的选择吗?或者创建从旧类继承的新类?什么是最好的方式?另外,我想尽可能多地使用已经创建的单元测试,而不是再次重写相同的测试用例.

Gad*_*adi 1

继承对于教科书来说很好,但在实践中却受到很大的限制。你应该使用接口和许多不同的实现:

interface ParkingLot {
    void park(Vehicle v); 
}

interface Vehicle {
     int size();
     boolean isDIsabled();
}
Run Code Online (Sandbox Code Playgroud)

您只公开在最高级别运行时绝对需要的内容。就像停车场停放车辆一样。车辆只能放入指定停车位或残疾人停车位。这就是停车场知道把车停在哪里的方式。

然后每个实现类都会执行其需要执行的操作以使流程正常运行。我认为楼层是内部实现细节,可能不需要在 API 上公开,但可以在内部使用。

还建议使用工厂根据楼层、电梯、厕所等来建造停车场,这样你就可以通过配置来建造通用停车场,而不是硬编码。

您可以使用“命令”在停车场之间传递停车命令,直到第一个停车场为您的汽车找到合适的停车位。在这种情况下,您将所有停车场链接起来并在它们之间传递请求。它也可以在楼层之间内部使用,因为每个楼层都会尝试找到从底层到屋顶的匹配。

您可以使用与寻找停车位相关的功能来“装饰”您的汽车。所以你又拥有一辆添加了不同功能的通用汽车。停车场设计也是如此。

当您通过停车命令时,停车场将读取装饰特征并决定是否有停车位。

例如,安全性适用于网站的用户角色(身份验证)的方式类似。