在 java 中对模型中的相关对象进行分类的好 OO 方法
Good OO way to categorize related objects in a model in java
我有一个 class 具有三个列表字段的车辆,即:
turboVehicles : List<ITurboVehicle>,
trailerVehicle : List<ITrailerVehicle>,
vehicles : List<IVehicle>
,(包含列表 1 和 2 及更多的所有车辆)
其中 ITurboVehicle
和 ITrailerVehicle
都扩展了 IVehicle
.
我希望这个class能够同时移动所有车辆,也能够同时gas()
、brake()
它们。问题是 ITurboVehicle
和 ITrailerVehicle
是 IVehicle
的子接口,并且具有我希望此 class 能够触发的更多功能,例如 turboOn()
和关闭。
主要问题:
为这些车辆列表建模以便在客户端代码中适当使用的好方法是什么?我想尽可能多地隐藏复杂性,并在面向对象的意义上将其组织得井井有条。例如,每当使用 addTrailerTruck(TrailerVehicle tv)
时,vehicles
和 trailerVehicles
列表都会更新,以便在使用 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();
}
}
我有一个 class 具有三个列表字段的车辆,即:
turboVehicles : List<ITurboVehicle>,
trailerVehicle : List<ITrailerVehicle>,
vehicles : List<IVehicle>
,(包含列表 1 和 2 及更多的所有车辆)
其中 ITurboVehicle
和 ITrailerVehicle
都扩展了 IVehicle
.
我希望这个class能够同时移动所有车辆,也能够同时gas()
、brake()
它们。问题是 ITurboVehicle
和 ITrailerVehicle
是 IVehicle
的子接口,并且具有我希望此 class 能够触发的更多功能,例如 turboOn()
和关闭。
主要问题:
为这些车辆列表建模以便在客户端代码中适当使用的好方法是什么?我想尽可能多地隐藏复杂性,并在面向对象的意义上将其组织得井井有条。例如,每当使用 addTrailerTruck(TrailerVehicle tv)
时,vehicles
和 trailerVehicles
列表都会更新,以便在使用 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();
}
}