根据客户的需求对内部状态进行不同的解释

Different interpretation of internal state based on what client wants

具有一些私有内部状态的模型对象。这种状态的一个组成部分暴露给客户。但是其中一个客户希望公开内部状态的不同组件。应该如何处理?举个例子

public GarageModel {
    private Vehicle car;
    private Vehicle truck;

    public Vehicle getMostInterestingVehicle() {
        //exposes car as the most interesting vehicle but
        //one of the client wants this to return a truck
        return car;
    }
}

您可以提供带有参数的方法,这些参数将定义您的客户看到最有趣车辆的标准。

public Vehicle getMostInterestingVehicleByCriteria(VehicleCriteria vehicleCriteria){
    // logic which selects correct vehicle in simple way it will be just
    if(vehicleCriteria.getMostInterestingVehicleType().equals(VehicleType.TRUCK){
        //do your logic
    }
    // In case of multiple objects you should refactor it with simple inheritance/polymorphism or maybe use some structural pattern 
}

public class VehicleCriteria{
    VehicleType mostInterestingVehicle; // enum with desired vehicle type

    public VehicleCriteria(VehicleType mostInterestingVehicle){
        this.mostInterestingVehicle = mostInterestingVehicle;
    }
}

如果客户端知道它想要什么类型,则让客户端使用通用参数(假定为 C#)说出来:

public T getMostInterestingVehicle<T>() where T : Vehicle { }

然后您可以使用 'things'(也许是工厂?)的字典来获得车辆,并按 return 的类型键入。这可能是在构造时创建或由 IoC 解析的静态集合:

private Dictionary<T, Vehicle> _things;

然后您可以使用它来完成工作:

public T getMostInterestingVehicle<T>() where T : Vehicle 
{ 
    FactoryThing thing;

    if (_things.TryGetValue(T, out thing))
    {
        return thing.GetVehicle();
    }
}

如果您使用的不是 C# 并且 syntax/usage 不正确,我深表歉意,但我想您会明白我的意思...

很难说根据您的示例,您可以在 GarageModel class 上为每个不同的客户应用策略模式,并覆盖该单一方法以满足他们的每个需求。不过,这只有在您可以为客户提供不同的车库模型时才有效。

多态性永远是答案正如我的一位老师曾经说过的

一个例子是

public TruckGarageModel: GarageModel {
    public override Vehicle getMostInterestingVehicle(){
        return truck;
    }
}

public CarGarageModel: GarageModel {
    public override Vehicle getMostInterestingVehicle(){
        return car;
    }
}

然后您将 GarageModel 的适当装饰版本传递给每个不同的客户

在决定实施之前,您可能需要考虑很多事情,一些问题是这些-

  • 您希望以后添加 Vehicle 的更新实现吗?:如果是,您可能必须提供一个工厂,无需在工厂中进行更改即可注册更新的类型一次又一次。 This 提供了一个示例。这样你也可以避免很多 if-else。
  • 你想在运行时决定 return 使用什么载具吗?:然后 Strategy Pattern 会像其他答案中指出的那样提供帮助。

希望对您有所帮助。