我正在尝试对车辆进行分类,但我不确定最好的方法是什么。
为什么我会感到困惑?如果你仔细想想,车辆可以按多种方式进行分类:
1)车辆性质:陆地车辆、WaterCrafts和AirCrafts。2)另一种分类方式:动力车辆和NonPowered车辆,如拖拉机(无动力,仅与卡车相连),卡车等。3)车辆的装载性质:车辆可以装载或不装载。
让我举个例子: Vehicle ->陆地车辆-> Powered/NonPowered ->可加载/不可加载。
如果你看到了,我创建了许多子类,但是除了属性差异,它还能有什么用呢,它是否可加载。我也可以使用接口来做到这一点。在车辆上实现可加载?供电接口,允许加载。
例如: vehicle -> LandVehicle ->拖拉机LandVehicle将实现像isPowered和isLoadable这样的接口,这些接口将被拖拉机覆盖为false和true。
我知道继承是用于"isa“关系和用于"can do”的接口,但这在这里有什么不同,因为它可以互换使用。
解决这类问题的最好方法是什么?
发布于 2016-02-12 09:00:46
解决这类问题的最好方法是使用KISS规则:保持简单愚蠢!
在这种情况下,对分类中的“主要”部分使用继承,对分类中的“次要”部分使用接口。这是因为Java只允许单继承(主要部分),但对类可以实现的接口(次要部分)的数量没有限制。
然而,如果你不想为每个类别添加行为,而只是想要一些Vehicle的描述,那么可以通过执行以下操作来使用组合:
public class Vehicle {
private List<VehicleDescription> descriptions = new ArrayList<VehicleDescription>();
public void addDescription(VehicleDescription description) {
descriptions.add(description);
}
public boolean hasDescription(VehicleDescription description) {
return descriptions.indexOf(description) > -1;
}
public enum VehicleDescription {
Land, Water, Air, Powered, NonPowered, Loadable, NonLoadable
}你可以在你的Vehicle类中添加任意多的"Description“类型枚举列表(这样你就可以避免像Loadable和NonLoadable这样的事情),而且你只需要几个类!
总之,尽可能使用组合。
发布于 2016-02-12 09:30:36
这些Vehicles在功能或属性方面是否有所不同
如果您需要混合使用这两种模式,请正确使用Builder + Decorator模式。
您可以在Vehicle类中使用Composite_pattern作为功能列表。Vehicle类将维护List < Capability >
看一下这些示例:
发布于 2016-02-12 17:18:17
组合在您的情况下匹配得更好。想象一下,您的车辆由点火系统、燃油系统、变速器、客舱等部件组成。正如您所看到的,许多类型的车辆都有独特的部件: 2、3、4轮、履带、悬停/前轮驱动、rwd、全速驱动/内燃机(燃油系统)或电动(电气系统)。继承会使你的架构受到很大的限制,并且很难修改。
有了组合,你甚至不需要对你的车辆进行分类。只需向它们添加组件即可。如果你想使用过滤器来搜索车辆的参数,如车轮数量,驱动类型-你可以实现一个接受标准的方法的ISearchable接口,并查找其车辆组件,无论它们是否都符合标准。
https://stackoverflow.com/questions/35352882
复制相似问题