在 java 中对模型中的相关对象进行分类的好 OO 方法

Good OO way to categorize related objects in a model in java

我有一个 class 具有三个列表字段的车辆,即:

  1. turboVehicles : List<ITurboVehicle>,
  2. trailerVehicle : List<ITrailerVehicle>,
  3. vehicles : List<IVehicle>,(包含列表 1 和 2 及更多的所有车辆)

其中 ITurboVehicleITrailerVehicle 都扩展了 IVehicle.

我希望这个class能够同时移动所有车辆,也能够同时gas()brake()它们。问题是 ITurboVehicleITrailerVehicleIVehicle 的子接口,并且具有我希望此 class 能够触发的更多功能,例如 turboOn() 和关闭。

主要问题:

为这些车辆列表建模以便在客户端代码中适当使用的好方法是什么?我想尽可能多地隐藏复杂性,并在面向对象的意义上将其组织得井井有条。例如,每当使用 addTrailerTruck(TrailerVehicle tv) 时,vehiclestrailerVehicles 列表都会更新,以便在使用 sub-class 特定方法时区分它们。我知道访问者模式可能是实现我一直在寻找的一些功能的不错选择,但我想尝试找到其他解决方案。

不太重要的回避问题:

以下与我一直在尝试使 Vehicles class 易于使用且直观的一般结构有关:我一直在尝试使用复合设计模式,但似乎复合 class 必须与组件属于同一类型,这让我有点卡住了。是否有任何方法可以使用复合模式并仍然能够访问所有子class 功能?

在我看来,最好只有一个 class 来管理所有车辆的状态。这样做之后,你的 classes 将对应 SOLID 的单一职责原则。详细了解 single responsibility principle of SOLID here

举个例子:

public interface IVehicle
{
    void Gas();

    void Brake();
}


public interface ITurboVehicle : IVehicle
{ }

public interface ITrailerVehicle : IVehicle
{ }

以及车辆的具体实现:

public class TrailerVehicle : ITrailerVehicle
{
    public void Brake()
    {
        throw new NotImplementedException();
    }

    public void Gas()
    {
        throw new NotImplementedException();
    }
}

和车辆管理员class:

public class VehicleManager
{
    public List<IVehicle> Vehicles { get; set; } = new List<IVehicle>();


    public void AddTrailer(ITrailerVehicle trailerVehicle)
    {
        Vehicles.Add(trailerVehicle);
    }


    public void GasAll() 
    {
        foreach (IVehicle vehicle in Vehicles)
            vehicle.Gas();
    }
}