Похоже, вы попали в общую ловушку. Реализация службы в основном одинакова для всех, поэтому вы хотите написать «общую» реализацию и затем кодировать клиентские расширения. Однако каждый раз, когда вам нужно сделать что-то особенное для клиента, вы в конечном итоге модифицируете реализацию общей службы, которая быстро превращается в бесполезный беспорядок.
Но на самом деле не существует правила, согласно которому реализация имеет , одинаковую для каждого клиента. Если бы было такое правило, у вас не было бы так много исключений. Правда состоит в том, что обработка отличается для каждого клиента, и они просто оказываются в основном одинаковыми сегодня .
Вы должны создать отдельную реализацию сервиса для каждого типа клиента.
Если вы сейчас начинаете говорить «но я не хочу дублировать весь общий код!», Тогда остановитесь. Возьмите части, которые действительно являются общими, и извлеките их в служебные методы, которые могут вызывать различные реализации клиента. Количество общего кода почти одинаково ...
class Client1Service implements Service {
void process() {
doCommonSetup();
doStuff1();
doCommonThing();
doStuffWithName("xyz");
sortasc();
doMoreCommonStuff();
processy();
}
}
... но теперь нет беспорядка условий, и когда вам нужно внести изменения, специфичные для клиента, есть место, где можно сделать это, чтобы не испортить реализации для всех других клиентов.
Когда вам нужно внести изменения в общие части, ну, есть также одна реализация этого материала, которую вы можете изменить.