我的目标是根据枚举返回一个方法。目前,我已经创建了一个工厂,但它使用的是我不喜欢的开关盒。代码工作正常,但我想使用更好的模式并替换当前的开关案例。你如何设计这个没有任何开关案例或如果否则(实例)......
我还尝试在枚举中实现策略模式。但是无法自动装配bean。
请参阅下面的我目前的代码。
public enum Car {
AUDI, FORD;
}
public class SuperCar{
private Car car;
}
public class Audi extends SuperCar{
// some other properties
}
public class Ford extends SuperCar{
// some other properties
}
@Service
public class AudiService{
public void save(Audi audi){
// some code
}
}
@Service
public class FordService{
public void save(Ford ford){
// some code
}
}
@Service
public class CarFactory{
private FordService fordService;
private AudiService audiService;
public CarFactory(FordService fordService, AudiService audiService) {
this.fordService = fordService;
this.audiService = AudiService;
}
public void saveCar(SuperCar superCar){
switch(superCar.getCar()):
case AUDI:
return audiService.save((Audi)superCar));
case FORD:
return fordService.save((Ford)superCar));
default:
return null;
}
}
感谢您的任何帮助。
如果只是替换switch
,我总是更喜欢使用map
的更具声明性的方法,因为它的接缝更容易维护和阅读:
private Map<Car, CarService> services;
public CarFactory(FordService fordService, AudiService audiService) {
this.services = Map.of(Car.FORD, fordService, Car.AUDI, audiService);
}
public void saveCar(SuperCar superCar) {
CarService service = services.get(superCar.getCar());
if (service != null) service.save(..);
}
使用通用接口:
private interface CarService<T extends SuperCar> {
void save(T car);
}
无论如何,我会重新考虑你的对象模型让超级汽车自救(正如其他人已经建议的那样)。
对不起,我无法发表评论。这里的汽车类型决定了汽车服务。我不确定战略模式是否适合这里。当同一辆车有不同的服务行为时,我会使用策略模式。例如:夏天我想使用XService,冬天我想使用YService作为AUDI。我认为有两种方法可以实现这一点。