根据客户的需求对内部状态进行不同的解释
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 会像其他答案中指出的那样提供帮助。
希望对您有所帮助。
具有一些私有内部状态的模型对象。这种状态的一个组成部分暴露给客户。但是其中一个客户希望公开内部状态的不同组件。应该如何处理?举个例子
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 会像其他答案中指出的那样提供帮助。
希望对您有所帮助。