Sto cercando di trovare un modo piacevole per implementare un servizio che si basa su una classe di libreria di terze parti. Ho anche un'implementazione "predefinita" da utilizzare come fallback nel caso in cui la libreria non sia disponibile o non sia in grado di fornire una risposta.Modello di fallback Java
public interface Service {
public Object compute1();
public Object compute2();
}
public class DefaultService implements Service {
@Override
public Object compute1() {
// ...
}
@Override
public Object compute2() {
// ...
}
}
L'attuale implementazione del servizio sarebbe qualcosa di simile:
public class ServiceImpl implements Service {
Service defaultService = new DefaultService();
ThirdPartyService thirdPartyService = new ThirdPartyService();
@Override
public Object compute1() {
try {
Object obj = thirdPartyService.customCompute1();
return obj != null ? obj : defaultService.compute1();
}
catch (Exception e) {
return defaultService.compute1();
}
}
@Override
public Object compute2() {
try {
Object obj = thirdPartyService.customCompute2();
return obj != null ? obj : defaultService.compute2();
}
catch (Exception e) {
return defaultService.compute2();
}
}
}
L'implementazione attuale sembra duplicare le cose un po 'nel modo in cui solo le chiamate effettive dei servizi sono diversi, ma la try/catch e il meccanismo predefinito è praticamente lo stesso. Inoltre, se nel servizio è stato aggiunto un altro metodo, l'implementazione sembrerebbe quasi uguale.
C'è un motivo di progettazione che potrebbe essere applicato qui (proxy, strategy) per rendere il codice un aspetto migliore e rendere ulteriori aggiunte meno copia-incolla?
Cosa versione di Java stai usando? – Radiodef