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

时间:2015-09-18 04:07:45

标签: oop design-patterns ooad

具有一些私有内部状态的Model对象。此状态的组件向客户端公开。但其中一个客户希望公开内部状态的不同组成部分。应如何处理?一个例子

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;
    }
}

4 个答案:

答案 0 :(得分:1)

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

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;
    }
}

答案 1 :(得分:1)

如果客户端知道它想要什么类型,那么让客户端用泛型参数说明(C#假设):

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

然后你可以使用一个“东西”字典(工厂可能吗?)来获得一辆车,按照他们返回的类型键入。这可以是在构造时创建的静态集合,也可以由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#你正在使用,如果语法/用法不正确,但我想你会明白我的意思......

答案 2 :(得分:1)

很难说给定您的样本,您可以在GarageModel类中为每个不同的客户端应用策略模式,并覆盖该单一方法以满足他们的每个需求。这只适用于您可以为您的客户提供不同的车库模型。

多态性总是答案作为我的老师曾经说过

一个例子是

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

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

然后,您将GarageModel的相应装饰版本传递给每个不同的客户

答案 3 :(得分:0)

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

  • 您是否希望稍后添加更新的Vehicle实施?:如果是,您可能必须提供一个可以注册较新类型的工厂,而无需一次又一次地在工厂中进行更改。 This提供了一个示例。这样你就可以避免许多if-else。
  • 你想决定在运行时返回什么样的车辆?:然后Strategy Pattern会像其他答案中所指出的那样有所帮助。

希望这有点帮助。