Шаблон построителя с наследованием

Я хочу представить 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, который использует аргументы и методы из класса и суперклассов, в которые он вставлен? ?

14
задан Stephen P 8 June 2012 в 00:38
поделиться