我正在尝试对车辆进行分类,但我不确定最好的方法是什么。
我为什么困惑?如果您考虑一下,车辆可以通过多种方式进行分类:
1(车辆性质:陆地车辆,船只和飞机。2(另一种分类方式:动力车辆和非动力车辆,如拖拉机(无动力,仅与卡车相连(,卡车等。3(车辆装载性质:车辆可装载或不装载。
我举个例子:车辆 -> 陆地车辆 ->有动力/无动力 ->可装载/不可装载。
如果您看到,我正在创建许多子类,但是除了属性差异之外,它有什么用途,它是可加载的。我也可以使用接口来做到这一点。为车辆实现可加载的动力接口,允许加载。
例如:车辆 -> 陆地车辆 -> 拖拉机LandVehicle将实现isPowered和isLoadable等接口,这些接口将被拖拉机覆盖为假和真
。我知道继承是"isa"关系和接口"可以做",但这在这里有什么不同,因为它可以互换使用。
解决此类问题的最佳方法是什么。
解决这类问题的最好方法是使用 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
}
您可以根据需要在车辆类中添加任意数量的"描述"类型枚举列表(这样您就可以防止同时执行可加载和不可加载之类的操作(,并且您只需要几个类!
总之,尽可能使用构图。
组合更适合您的情况。想象一下,您的车辆由点火系统、燃油系统、变速箱、驾驶室等组件组成。如您所见,许多类型都有独特的组件:2、3、4 轮、履带、悬停/前轮、后轮、AWD/内燃机(燃油系统的意思(或电动(电气系统(。继承将使你的架构非常受约束,难以修改。
使用组合,您甚至不需要对车辆进行分类。只需向它们添加组件即可。如果您想使用过滤器按参数(如车轮数量、驱动类型(搜索车辆 - 您可以使用接受标准的方法实现 ISearchable 接口,并查找其车辆组件是否都符合标准。
这些Vehicles
是否因功能或属性而异?
-
属性:使用Builder_pattern建造具有不同属性的不同类型的战车。
功能 :使用接口提供不同的功能,并定义装饰器以添加功能。
如果需要混合使用两者,请正确使用Builder
+ Decorator
模式。
您可以将Composite_pattern用于类中的功能列表Vehicle
。 Vehicle
类将保持List < Capability >
看看这些例子:
将构建器保持在单独的类中(流畅的接口(
何时使用装饰器模式?