Я хочу представить URL-запрос веб-службы в виде объекта и обнаружил, что существует множество общих параметров, которые можно «надувать» в иерархии наследования. Запрос может иметь множество параметров, как обязательных, так и необязательных, для которых, я считаю, шаблон Bloch Builder является хорошим вариантом, эмулирующим именованные аргументы с плавным интерфейсом.
В частности, я разрабатываю API веб-сервиса Google Maps, у которого в качестве общего запроса веб-сервиса
http://maps.googleapis.com/maps/api/service/output?{parameters}
сервис
и вывод
являются обязательными аргументами и сенсор
. ] обязательный параметр. Существует также необязательный параметр язык
.
Каждый сервис имеет свой набор обязательных и необязательных параметров. У сервиса геокодирования есть два необязательных параметра: bounds
и region
. Он также имеет взаимоисключающие обязательные параметры, адрес
или местоположение
, которые определяют тип сервиса (прямое или обратное геокодирование соответственно). Я представляю это взаимоисключение с новыми детскими классами.
Я представляю себе иерархию классов как таковую:
.-----.
| Url |
'-----'
^
|
.---------.
| Request |
'---------'
^
|----------------------------+--------------...
.---------. .------------.
| Geocode | | Directions |
'---------' '------------'
^ ^
|------------+ .
.--------. .---------. .
| Direct | | Reverse | .
'--------' '---------'
Затем я хотел бы сделать что-то вроде следующего:
String output = "xml";
boolean sensor = true;
String address = "Av. Paulista, São Paulo, Brasil";
Bounds bounds = new Bounds(-20, -10, -25, -20); //Geographic rectangle
String region = "br";
String lang = "pt-BR";
Coord location = new Coord(-12,-22);
DirectGeocodeRequestUrl direct =
new DirectGeocodeRequestUrl.Builder(output, sensor, address)
.bounds(bounds)
.language(lang)
.build();
ReverseGeocodeRequestUrl reverse =
new ReverseGeocodeRequestUrl.Builder(output, sensor, location)
.language(lang)
.region(region)
.build();
Как я могу создать Builder, который использует аргументы и методы из класса и суперклассов, в которые он вставлен? ?