Шаблон прокси Java? - PullRequest
       0

Шаблон прокси Java?

0 голосов
/ 14 февраля 2019

У меня есть следующие классы на 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, чтобы получить температуру), мне придется изменить этот класс, и это нарушает принцип ОТКРЫТЬ / ЗАКРЫТЬ

  • Это не настоящая бизнес-логика, я имею в виду, оценитьесли мне нужно вызвать службу 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 (принцип единой ответственности), а затем принципу ОТКРЫТО / ЗАКРЫТО

  • Если вам нужно добавить другую возможную услугу для получения температуры, вам не нужно изменять класс WeatherInformationService, просто WeatherInformationProxyService

Второй дизайн:

  • будетПРОКСИ или аналог?Как вы думаете?
  • Мне не нравится тот факт, что мне нужно изменить WeatherInformationProxyService, если я хочу добавить другой сервис, из которого можно получить температуру (это нарушает принцип ОТКРЫТО / ЗАКРЫТО).Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете решить эту проблему, пройдя полный SRP.Вы можете создать несколько реализаций на основе XML, JSON или любым другим способом, которым реализован ваш веб-сервис.

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, вы можете просто создать несколько реализаций и полагаться на них как на единый источник информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...