Мне нужен совет, для каких сценариев динамический прокси окажется более полезным, чем обычный прокси.
Я приложил немало усилий, чтобы научиться эффективно использовать динамические прокси.В этом вопросе оставьте в стороне то, что фреймворки, такие как AspectJ, могут выполнять практически все, что мы пытаемся достичь с помощью динамических прокси, или что, например, CGLIB может использоваться для устранения некоторых недостатков динамических прокси.
Варианты использования
- Декораторы - например, выполнять регистрацию при вызове метода или кэшировать возвращаемые значения сложных операций
- Подтвердить контракт - то есть убедиться, что параметрыв пределах допустимого диапазона и возвращаемые типы соответствуют принятым значениям.
- Адаптер - где-то увидел умную статью, описывающую, как это полезно.Я редко сталкиваюсь с этим шаблоном дизайна все же.
Остальные?
Преимущества динамического прокси
- Декоратор: регистрирует все вызовы методов, например,
public Object invoke(Object target, Method method, Object[] arguments) {
System.out.println("before method " + method.getName());
return method.invoke(obj, args);
}
}
Шаблон декоратора определенно полезен, так какпозволяет побочные эффекты для всех методов прокси (хотя это поведение является примером использования аспектов ..).
- Контракт: в отличие от обычного прокси, нам не нужно реализовывать полный интерфейс.Например,
public Object invoke(Object target, Method method, Object[] arguments) {
if ("getValues".equals(method.getName()) {
// check or transform parameters and/or return types, e.g.,
return RangeUtils.validateResponse( method.invoke(obj, args) );
}
if ("getVersion".equals(method.getName()) {
// another example with no delegation
return 3;
}
}
Контракт, с другой стороны, дает только преимущество, заключающееся в необходимости реализации полного интерфейса.С другой стороны, рефакторинг прокси-методов молча сделает недействительным динамический прокси.
Заключение
Итак, я вижу здесь один реальный вариант использования и один сомнительный вариант использования.Каково ваше мнение?