Я хочу представить URL-адрес URL-адреса веб-службы в качестве объекта и обнаружил, что существует множество общих параметров, которые могут быть "пузырящимися" в иерархии наследования. В запросе может быть множество параметров, некоторые обязательные и другие необязательные, для которых я считаю, что шаблон Bloch Builder является хорошим вариантом, эмулируя именованные аргументы с плавным интерфейсом.
В частности, я разрабатываю API-интерфейс веб-сервиса Google Maps, который имеет общий запрос веб-службы
http://maps.googleapis.com/maps/api/service/output?{parameters}
service
и output
являются обязательными аргументами, а sensor
обязательным параметром. Существует также необязательный параметр language
.
Каждая служба имеет свой набор обязательных и необязательных параметров. Служба Geocode имеет два необязательных параметра: bounds
и region
. Он также имеет взаимоисключающие обязательные параметры address
или location
, которые определяют тип службы (прямое или обратное геокодирование, соответственно). Я представляю это взаимное исключение с новыми классами детей.
Я представляю иерархию классов как таковую:
.-----.
| 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, который использует аргументы и методы из класса и суперклассов, в которые он вставлен?