Лучший способ смоделировать систему с одним интерфейсом, используемым по-разному в Java - PullRequest
0 голосов
/ 13 мая 2011

У меня есть класс, который реализует интерфейс

class TopLevel implements TopLevelOperations

внутри TopLevel, операции реализуются двумя различными способами.Поэтому некоторые операции в TopLevelOperations должны вызываться как клиентские вызовы SOAP, а некоторые - как вызовы restful.

Каков наилучший способ для моделирования этого?Создайте два дополнительных интерфейса SOAPOperations и RESTOperations, чтобы указать, какова ответственность restful и SOAP соответственно?Затем использовать два других класса внутри, которые реализуют эти интерфейсы?Мотивация заключается в том, что я могу однажды захотеть поменять SOAP на какой-то другой подход.

Лучший способ?

Редактировать: я также не хочу, чтобы другой клиентский код смешивался в TopLevel, так какв настоящее время.

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Не уверен, что решение должно быть таким сложным (если, конечно, я понимаю проблему ...):

  1. Убедитесь, что TopLevelOperations объявляет все методы, которые может использовать клиент.Делайте это независимым от протокола способом, например TopLevelOperations.doFoo(), а не TopLevelOperations.doFooOverSOAP()
  2. Реализация TopLevel в качестве первой версии интерфейса с использованием SOAP / REST в зависимости от ситуации.
  3. Убедитесь, что клиентытолько когда-либо ссылаются TopLevelOperations при объявлении ссылок - никогда не реализующий класс
  4. Используйте какой-либо механизм, подходящий для вашего приложения, чтобы внедрить соответствующую реализацию в клиенты (Dependency Injection / Factory / ...).

Если / когда вы хотите повторно реализовать методы, используя другой транспорт / протокол, просто создайте другой класс (TopLevelNew), который реализует TopLevelOperations.Затем введите его клиентам вместо TopLevel в шаге 4 выше.

Решение о том, какую реализацию использовать, является решением конфигурации уровня приложения, а не тем, о чем должны знать клиенты.

hth.

[Возможно, вы захотите /нужно использовать некоторые классы помощников для реализации, например, отделить контент от полезной нагрузки согласно ответу @ user384706.Но это дополняет вышеприведенное (то есть, как спроектировать реализацию и как поддерживать согласованность интерфейса для клиентов).]

0 голосов
/ 13 мая 2011

Что вам нужно сделать, это отделить транспортный уровень от полезной нагрузки.
Оба запроса по сети передаются по протоколу HTTP, но полезная нагрузка отличается, т. Е. В одном случае он заключен в конверт SOAP, а в REST - чисто XML-данные.
Поэтому для кода более высокого уровня у вас должен быть интерфейс, который просто отправляет сообщение, инкапсулированное в объекте.
Реализация этого интерфейса преобразует сообщение в XML (через DOM или JAXB и т. Д.).
Затем этот XML передается на транспортный уровень для отправки по HTTP или , заключенному в SOAP-сообщение перед передачей его на транспортный уровень.
Транспортный уровень может быть просто конкретным классом, который так просто:

public class HttpClient{

      public String sendMsg(String xml){
       //Use some HTTP client to send message and return the response.
      //The input could be SOAP or plain xml app data
      //The output could be SOAP or plain xml app data
      }
    }

Таким образом, пользователь настраивает ваши объекты для использования SOAP или нет.
Код приложения знает только интерфейс для отправки сообщения.
В вашей реализации из-за разделения преобразования XML и транспортных уровней HTTP вы можете поменять местами реализации или добавить новые.

...