代理模式Java?

时间:2019-02-14 20:56:40

标签: design-patterns proxy

我在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

第二种设计:

  • 是代理模式还是类似模式?你觉得呢?
  • 我不喜欢这样的事实,如果我想添加另一个从那里获取温度的服务(必须违反OPEN / CLOSED原理),就必须修改WeatherInformationProxyService。有什么想法吗?

谢谢

1 个答案:

答案 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,而只需创建多个实现并将其作为单一信息源即可依靠。