如何对车辆进行分类 - 继承与接口



我正在尝试对车辆进行分类,但我不确定最好的方法是什么。

我为什么困惑?如果您考虑一下,车辆可以通过多种方式进行分类:

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是否因功能属性而异?

  1. 属性:使用Builder_pattern建造具有不同属性的不同类型的战车。

  2. 功能
  3. :使用接口提供不同的功能,并定义装饰器以添加功能

如果需要混合使用两者,请正确使用Builder + Decorator模式。

您可以将Composite_pattern用于类中的功能列表VehicleVehicle类将保持List < Capability >

看看这些例子:

将构建器保持在单独的类中(流畅的接口(

何时使用装饰器模式?

最新更新