interface Server
{
void accept(String xml);
void send();
}
class ServerThatUsesXML implements Server
{
Server server;
@Override
public void accept(String xml) {
if (xml.equals("XML"))
System.out.println("Data accepted successfully.");
else
System.out.println("There was a problem in processing the data.");
}
@Override
public void send() {
server.accept("XML");
}
}
class ServerThatUsesJSON implements Server
{
Server server;
@Override
public void accept(String json) {
if (json.equals("JSON"))
System.out.println("Data accepted successfully.");
else
System.out.println("There was a problem in processing the data.");
}
@Override
public void send() {
server.accept("JSON");
}
}
class Converter
{
public String convertToXML(String json)
{
return "XML";
}
public String convertToJSON(String xml)
{
return "JSON";
}
}
class Adapter implements Server
{
Server xml, json;
Converter converter = new Converter();
public Adapter(Server xml, Server json) {
this.xml = xml;
this.json = json;
}
@Override
public void accept(String input) {
// converter.convertTo...
}
@Override
public void send() {
// converter.convertTo...
}
}
public class Main {
public static void main(String[] args) {
ServerThatUsesXML xml = new ServerThatUsesXML();
ServerThatUsesJSON json = new ServerThatUsesJSON();
xml.server = json;
json.server = xml;
xml.send(); // There was a problem in processing the data.
json.send(); // There was a problem in processing the data.
Adapter adapter = new Adapter(xml, json);
xml.server = adapter;
json.server = adapter;
xml.send();
json.send();
// Both calls should print "Data accepted successfully.".
}
}
В этом примере у меня два сервера. К сожалению, один сервер использует XML
, а другой - JSON
. Им обоим нужно общаться друг с другом. Итак, я сделал адаптер, реализующий интерфейс Server
и содержащий два сервера. Я хочу, чтобы каждый раз, когда ServerThatUsesXML
отправляет что-то в адаптер, адаптер конвертирует это в JSON
и пересылает на ServerThatUsesJSON
. То же самое касается преобразования JSON
запросов в XML
запросов.
Проблема в том, что, поскольку два сервера реализуют один и тот же интерфейс, оба сервера имеют одинаковые методы с одинаковым назначением. Поэтому, когда я вызываю accept
, например, на Aapter
, Adapter
не будет знать, откуда пришел запрос и каким образом он должен go. Следует передать его на сервер JSON
? или я должен передать его на сервер XML
?
У меня есть два решения, но они не выглядят такими чистыми ... Поэтому я спрашиваю, есть ли лучший подход для решения этой проблемы.
Решение первое: проверить формат текста. Если это текст XML
, преобразуйте его в JSON
и отправьте в ServerThatUsesJSON
. То же самое и для запросов, конвертируемых из JSON
в XML
. Этот подход, вероятно, наихудший, поскольку он не проверяет отправителя и пересылает запросы только на основе формата текста. Также он просматривает текст, чтобы проверить формат. Это не так эффективно.
Второе решение: сделать два адаптера, один, который принимает XML
и отправляет JSON
, а другой, который принимает JSON
и отправляет XML
. А затем передайте первый в ServerThatUsesXML
. А второй передайте в ServerThatUsesJSON
. Это решение выглядит лучше первого (по крайней мере, более эффективно).
Мой вопрос: могу ли я сделать две функции accept
, например accpetXML
и acceptJSON
, а в функции accept
, в зависимости от типа вызывающего абонента, я либо вызываю XML
версия или версия JSON
. Код должен выглядеть примерно так:
public void accept(String input, ....)
{
if (senderType == ServerThatUsesXML)
acceptJSON(converter.convertToJSON(input));
else
acceptXML(converter.convertToXML(input));
}