#java #xml #design-patterns
#java #xml #шаблоны проектирования
Вопрос:
Я пишу Java-клиент, который взаимодействует с удаленным сервером через HTTP / XML.
Сервер отправляет команды моему клиенту в формате XML, вот так:
<command>
<name>C1</name>
<param>
.....
</param>
</command>
Существует около 10 или более различных команд (C1, C2, …), каждая из которых имеет разный набор параметров.
Мой клиент обработает команду, затем сервер ответов с результатом выполнения выглядит следующим образом:
<C1>
<code>200</code>
<desc>xxx</desc>
</C1>
Я знаком только с C, но очень новичок в Java и ООП,
итак, мой вопрос прост: как изящно спроектировать следующую логику способом ООП?
1. Преобразуйте XML-строку в XML-объект
2. Найдите соответствующего исполнителя на основе элемента ‘name’ XML и проанализируйте параметры
3. Выполните команду вместе с параметрами
4. Преобразуйте результат в XML-объект
5. Преобразуйте XML-объект в XML-строку
Хороший ли это дизайн?
1. Определите абстрактный базовый класс и множество подклассов для каждой команды, которые включают следующий метод:
void parseCommand(MyXMLObject obj);
void execute();
MyXMLObject generateResult();
или просто простой метод:
MyXMLObject execute(MyXMLObject obj);
и эти поля:
String mCommandName;
int mRetCode;
String mRetDesc;
2. Затем определите класс factory для возврата экземпляра одного из подклассов на основе XML-объекта.
3. Код логической части:
MyXMLObject obj = MyXMLUtil.getXMLObject(XMLString);
MyCommand command = MyCommandFactory.getCommand(obj);
MyXMLObject retObj = command.execute();
String retStr = MyXMLUtil.getString(retObj);
...//network operation
Ответ №1:
Вообще говоря, это хороший дизайн (вам, вероятно, нужно больше интерфейсов и тому подобного, и есть различные усовершенствования).
Большая проблема заключается в том, что это, во многих отношениях, переосмысление колеса. Существует множество фреймворков, которые обрабатывают отображение из POJOs (объектов Java) в структурированные текстовые форматы (такие как XML или JSON). Кроме того, существует множество общих реализаций командных фреймворков. Возможно, стоит изучить доступные варианты, прежде чем предоставлять собственную реализацию.
Комментарии:
1. Спасибо за ваше предложение. Я искал некоторые «командные фреймворки», но пока не нашел ни одного хорошего примера : (
2. @bhh: Почти в каждой компании, в которой я был, есть очень хорошая и проверенная реализация командной строки. Я уверен, что существуют также альтернативы с открытым исходным кодом (хотя это может заслуживать отдельного вопроса о stackoverflow). Но определенно существуют готовые решения для перехода с POJOs на формат, подобный XML или JSON.
Ответ №2:
В принципе, да, именно так все и работает. Но я думаю, вам следует разделить различные проблемы.
В принципе, я бы сказал, что у вас есть уровень сервиса, который должен выполнять команды и возвращать результаты. Этот уровень ничего не должен знать о XML, поэтому я бы разработал простую объектную модель Java, а затем побеспокоился о привязке ее к вашей инфраструктуре XML, возможно, используя существующую технологию отображения XML, такую как XStream.
Комментарии:
1. JAXB является стандартом (JSR-222) для сопоставления объекта с XML: bdoughan.blogspot.com/2010/10 /… . XStream — это технология сериализации: xstream.codehaus.org/faq.html#Uses
Ответ №3:
Как говорили другие, дизайн выглядит довольно неплохо. Чтобы упростить себе жизнь, вам следует ознакомиться с Simple XML для синтаксического анализа XML -> Java и создания XML из объектов Java.
Комментарии:
1. Проверьте: bdoughan.blogspot.com/2010/10 /…
2. @Blaise: 1. Обычно я с подозрением отношусь к стандартам Java, но поскольку вы сравниваете Simple и JAXB параллельно, я попробую это для своего следующего проекта.