具有一些私有内部状态的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;
}
}
答案 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)
在做出有关实施的决定之前,您可能需要考虑很多事情,有些问题是这些 -
希望这有点帮助。