Я пытаюсь найти хороший способ реализации службы, основанной на классе сторонней библиотеки. У меня также есть реализация «по умолчанию», которую можно использовать в качестве запасного варианта на случай, если библиотека недоступна или не может дать ответ.
public interface Service {
public Object compute1();
public Object compute2();
}
public class DefaultService implements Service {
@Override
public Object compute1() {
// ...
}
@Override
public Object compute2() {
// ...
}
}
Фактическая реализация службы будет выглядеть примерно так:
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();
}
}
}
Текущая реализация, кажется, немного дублирует вещи в том смысле, что различаются только фактические вызовы служб, но механизм try/catch и механизм по умолчанию почти одинаковы. Кроме того, если бы в службу был добавлен еще один метод, реализация выглядела бы почти одинаково.
Может ли здесь применяться шаблон проектирования (прокси, strategy), чтобы код выглядел лучше и чтобы дальнейшие добавления были менее копипасты?