Desidero rappresentare una richiesta di URL del servizio Web come oggetto e ho scoperto che ci sono molti parametri comuni che potrebbero essere "ribolliti" in una gerarchia di ereditarietà. Una richiesta potrebbe avere molti parametri, alcuni obbligatori e altri facoltativi, per i quali credo che il pattern di Bloch's Builder sia una buona opzione, che emula argomenti con un'interfaccia fluente.Modello di builder con ereditarietà
In particolare, sto progettando per il servizio Web API di Google Maps, che ha come richiesta del servizio generale web
http://maps.googleapis.com/maps/api/service/output?{parameters}
service
e output
sono argomenti obbligatori, e sensor
un parametro obbligatorio. C'è anche un parametro opzionale language
.
Ogni servizio ha il suo set di parametri obbligatori e opzionali. Il servizio di geolocalizzazione ha due parametri opzionali, bounds
e region
. Dispone inoltre di parametri obbligatori mutuamente esclusivi, address
o location
, che specificano il tipo di servizio (geocodifica diretta o inversa, rispettivamente). Rappresento questa mutua esclusione con nuove classi di bambini.
Immagino che la gerarchia di classe in quanto tale:
.-----.
| Url |
'-----'
^
|
.---------.
| Request |
'---------'
^
|----------------------------+--------------...
.---------. .------------.
| Geocode | | Directions |
'---------' '------------'
^ ^
|------------+ .
.--------. .---------. .
| Direct | | Reverse | .
'--------' '---------'
Poi, mi piacerebbe fare qualcosa di simile al seguente:
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();
Come posso creare un cantiere che utilizza argomenti e metodi da la classe e le superclassi in cui è inserita?
L'implementazione sovrascritta di 'getThis()' nelle classi concrete non dovrebbe essere astratta. – Eric
@EricTobias Hai ragione, un pericolo di copia-incolla. Fisso. –
Questo è fantastico! Esattamente quello che stavo cercando! – Maddy