我正在尝试编写驾驶模拟程序,我需要一些设计方面的帮助。我有一个名为RoadObjects的界面,现在包含车辆和哺乳动物。我需要实施不同类型的汽车,如卡车,轿车,半成品。他们有一些共同的方法和一些独特的方法。稍后,我会添加其他种类的车辆和哺乳动物。我不想使用继承,我试图根据设计原则和模式,如开放原则和工厂来做到这一点。现在我的问题是,我应该这样设计:
RoadObject interface
Vehicle extends RoadObject
Mammal extends RoadObject
SedanImpl implements Vehicle
TruckImpl implements Vehicle
People implements Mammal
...
...
或者我应该没有车辆和人员界面并且这样做?
RoadObject interface
SedanImpl implements RoadObject
TruckImpl implements RoadObject
People implements RoadObject
新问题: 我想使用工厂模式,例如选择哪种车辆。所以我制作了一个VechicleImpl和VechicleImplFactory,所以看起来像这样:
RoadObject interface
Vehicle extends RoadObject
VehicleImpl implements Vehicle
Mammal extends RoadObject
SedanImpl implements Vehicle
TruckImpl implements Vehicle
People implements Mammal
这种糟糕的设计吗?因为VehicleImpl会有很多重复的SedanImpl,TruckImpl等方法。或者如果我想拥有一个createVehicle的工厂,那么它应该在哪里?
答案 0 :(得分:0)
有些合理:
- public interface IRoadObject
- public class People implements IRoadObject
- public class Vehicle
- public class Truck extends Vehicle implements IRoadObject
- public class Sedan extends Vehicle implements IRoadObject
但是,它仍然取决于要求。没有明确的要求,我想这很简单。
答案 1 :(得分:0)
答案 2 :(得分:0)
这两种方法都是有效的,无论您是否需要明确的车辆抽象取决于您的要求。 SedanImpl
,TruckImpl
等可能会分享车辆常见但与人类/动物无关的一些功能:
public interface Vehcile extends RoadObject
getTires()
getEngine()
正如您在Java中标记的那样,常见abstract
类也可能有用:
public abstract class AbstractVehicle implements Vehicle {
private Integer tires = 4;
public Integer getTires() { return this.tires; }
/* ... */
}
因此TruckImpl
可以继承AbstractVehicle
:
public class TruckImpl extends AbstractVehicle {
/* ... */
}