我在Java中有这些类:
public interface WeatherInformationServiceInterface {
public double getTemperature(Date date, City city);
}
public class WeatherInformationService implements WeatherInformationServiceInterface {
@Override
public double getTemperature(Date date, City city) {
//Depending on system configuration you will get this information from
//jsonservice or a xml service
if ("JSONService".equals(configurationVariable)) {
//call JSONService
} else if ("XMLService".equals(configurationVariable)) {
//call XMLService
}
}
}
我对这种设计的想法很差,因为:
如果将来在系统中添加了其他服务(例如RMI服务以获取温度),则必须修改此类和 违反了OPEN / CLOSE原则
这不是真正的业务逻辑,我的意思是评估是否必须调用JSON服务或XML服务
我的替代设计如下:
public class WeatherInformationService implements WeatherInformationServiceInterface {
private WeatherInformationProxyService proxyService;
@Override
public double getTemperature(Date date, City city){
return proxyService.getTemperature(Date date, City city);
}
}
public class WeatherInformationProxyService implements WeatherInformationServiceInterface{
@Override
public double getTemperature(Date date, City city) {
//Depending on system configuration you will get this information from
//jsonservice or a xml service
if ("JSONService".equals(configurationVariable)) {
//call JSONService
} else if ("XMLService".equals(configurationVariable)) {
//call XMLService
}
}
}
第二种设计会更好,因为:
您专注于类WeatherInformationService
中的实际业务逻辑,并将代理逻辑委托给WeatherInformationProxyService
,因此这将符合SRP(单一职责原则),然后符合OPEN / CLOSED原则
如果您必须添加其他可能的服务来获取温度,则不必修改WeatherInformationService
类,只需修改WeatherInformationProxyService
第二种设计:
WeatherInformationProxyService
。有什么想法吗?谢谢
答案 0 :(得分:0)
您可以通过全面使用SRP来解决此问题。您可以基于XML,JSON或以任何方式实施Web服务的方式创建多个实现。
public class WeatherInformationJsonImpl implements WeatherInformationService {
@Override
public double getTemperature(Date date, City city) {
// Get the temprature from the JSON Service
}
}
public class WeatherInformationXmlImpl implements WeatherInformationService {
@Override
public double getTemperature(Date date, City city) {
// Get the temprature from the XML Service
}
}
然后,您只需创建实现的一个实例并将其注入您的服务使用者即可。
public class WeatherInformationProvider {
private WeatherInformationService service;
public double gimmeSomeDigits(Date date, City city) {
return service.getTemperature(date, city);
}
public void setWeatherInformationService(WeatherInformationService service) {
this.service = service;
}
}
现在,您无需创建configurationVariable
,而只需创建多个实现并将其作为单一信息源即可依靠。