Самый простой способ, который я нашел, - заставить ваш класс реализовать пустой интерфейс.
Затем вы используете AspectJ для вставки реализации в интерфейс.
Таким образом, если вам нужно изменить алгоритм, вы можете просто использовать другой аспект, и проблема решена.
Для этого вы можете посмотреть руководство по использованию inter-type:
http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html#inter-type-declarations
Обновление: Из-за понижающего голоса я собираюсь предположить, что некоторые люди не поймут, о чем я говорю, поэтому самый простой способ - это пример. В этой статье есть несколько хороших примеров внедрения методов в интерфейс.
http://ramnivas.com/blog/index.php?p=20
Это не реализация паттерна Стратегия, но основная концепция та же, что позволяет легко переключаться с одного алгоритма на другой, не изменяя какую-либо другую часть кода. Единственный другой способ сделать это - использовать DI и просто внедрить новый конкретный класс, каждый из которых имеет один и тот же интерфейс для Стратегии, но об этом не может быть и речи.
Обновление 2: Вот несколько ссылок, показывающих, что можно сделать с помощью AOP:
Избавление от расчетной плотности шаблона: http://www.ibm.com/developerworks/java/library/j-aopwork7/index.html
Улучшение шаблонов проектирования с AspectJ: http://www.ibm.com/developerworks/java/library/j-aopwork6/index.html
AspectJ может быть использован гораздо больше, чем просто некоторые общие сквозные задачи. Большинство шаблонов проектирования GoF могут быть легко реализованы или удалены с помощью AspectJ.