我正在尝试对车辆进行分类,但我不确定最佳方法是什么。
为什么我感到困惑? 如果你考虑一下,可以通过多种方式对车辆进行分类:
1)车辆的性质:陆地车辆,水车和水车。飞行器。 2)另一种分类方式:动力车辆和无动力车辆,如拖拉机(非动力,只附卡车),卡车等。 3)车辆的装载性质:车辆是否装载。
让我举一个例子: 车辆 - >陆地车辆 - >动力/无动力 - >可加载/ NonLoadable。
如果你看到,我正在创建许多子类,但除了可加载与否之外的属性差异之外还有什么用途。我也可以使用接口来做到这一点。实现可装载的车载接口,可以进行装载。
例如: 车辆 - > LandVehicle - >拖拉机 LandVehicle将实现像isPowered和isLoadable这样的接口,拖拉机会将其覆盖为false和true resp。
我知道继承是针对“isa”关系和“可以做”的接口,但是如何在这里产生差异,因为它可以互换使用。
解决此类问题的最佳方法是什么。
答案 0 :(得分:1)
解决此类问题的最佳方法是使用 KISS 规则:保持简单傻!
在这种情况下,请使用" major"分类中的分歧,并使用" minor"分类中的分歧。这是因为 Java只允许单继承(主要部门),但是对接口数量没有限制(小班子)班级可以实施。
然而, 如果您 希望为每个类别添加行为,并且只想要{{1}的某些描述通过执行以下操作来使用组合:
Vehicle
您可以添加尽可能多的"说明"您可以根据需要在您的Vehicle类中键入枚举列表(这样您就可以防止执行可加载和非可加载的操作),并且您只需要几个类!
总之,尽可能使用构图。
答案 1 :(得分:1)
这些Vehicles
是否因功能或属性而不同?
属性:使用Builder_pattern构建具有不同属性的不同类型的车辆。
功能:使用界面提供不同的功能,并定义Decorator以添加功能。
如果您需要混合两者,请正确使用Builder
+ Decorator
模式。
您可以使用Composite_pattern获取Vehicle
课程中的功能列表。 Vehicle
课程将保留List < Capability >
看看这些例子:
答案 2 :(得分:0)
组合在您的情况下更好地匹配。想象一下,您的车辆由点火系统,燃油系统,变速箱,驾驶室等部件组成。您可以看到许多类型都有独特的部件:2,3,4轮,履带,悬停/前进,后轮,发动机/内燃机(燃料系统意味着)或电动(电力系统)。继承将使您的体系结构受到限制并且难以修改。
通过合成,您甚至无需对车辆进行分类。只需添加组件即可。如果您想使用过滤器按照车轮数量,驱动器类型等参数搜索车辆 - 您可以使用接受标准并查找其车辆组件的方法来实现ISearchable接口,无论它们是否都符合标准。