Суть вопроса вот в чем.
Есть сервис @Service для работы с документами (создание,удаление,...). Проблема в том что некоторые операции могут иметь специфичные особенности в зависимости от типа документа. Например при удаление одного документа нужно почистить какие то его дополнительные данные, при удалениии другого проверить можно ли его удалять, при удалении третьего скопировать его на хранение и т.д. Сам сервис выполняет общую логику (логирование, общие проверки, фактическое удаление), а куда вынести специфичную для документа?
Наследовать специфичный сервис от общего и перекрывать методы? Но тогда придется частично дублировать общий код. Или в общий метод удаления внедрить метод делегат, который на время передает управление специфичному коду, а потом возвращается в основной? Или как правильно? что то я запутался)
Попробуйте использовать паттер strategy.
Создаете enum с перечислением всех типов документов и под каждый тип пишите обработчик, обработчик содержит методы save, read, edit и т.п. для каждого типа документа. Также делаете дефолтовую реализацию, если для какого-нибудь типа документа не нужно менять логику. В своем общем сервисе будете в runtime вызывать обработчик для типа документа и выполнять нужные методы.