2013-02-28 2 views
3

У меня есть два бобы обслуживания, которые называются PowerUserManager и SimpleUserManager. Оба аннотированных класса @Service имеют около 20% общего кода.Лучше всего использовать наследование в слое весеннего сервиса?

Я создал дерево наследования с общим аннотация класс (BaseUserManager), чтобы уменьшить избыточность между двумя классами.

       BaseUserManager 
             | 
           --------------- 
           |    | 
         PowerUserManager SimpleUserManager 

Тогда в моей или любой другой клиентский класс @Controller, я использую @Autowired аннотацию вводить как PowerUserManager и SimpleUserManager и я использую один из них в зависимости от экземпляра пользователя я имею дело с.

Я не комфортно, используя наследование факторизовать код особенно в службы слоя. У вас, весёлые парни, есть лучший способ сделать это?

+0

Являются ли общедоступные интерфейсы одинаковыми с различным поведением или же они имеют различные методы, которые применяются только к каждому типу пользователя? – Romski

+0

@Romski PowerUserManager имеет различные методы, которые применяются только к PowerUser – webpat

ответ

2

Вы должны задать себе некоторые основные вопросы, прежде чем рассматривать наследование над состав в этом случае, and in general:

  1. ли все менеджеры пользователь вводит BaseUserManager? Является ли это отношением IS-A в любом возможном случае?
  2. Имеет ли смысл распространять публичный API BaseUserManager везде, где пользовательский менеджер включен?
  3. Имеет ли BaseUserManager личную ответственность?

Если да, то наследование - это правильный путь. В противном случае вы должны, вероятно, перепроектировать несколько меньших компонентов и рассматривать PowerUserManager и SimpleUserManager в качестве сервисных фасадов.

+0

Что вы подразумеваете под одной ответственностью для BaseUserManager? – webpat

+0

Поддерживает ли BaseUserManager принципы OOP или это грязный класс утилиты, который просто упрощает случаи общего использования в других менеджерах? Например, если BaseUserManager будет отвечать за: управление разрешениями и ролями, регистрацию, активацию учетной записи, перечисление учетной записи и приготовление кофе, тогда, может быть, неплохо было бы делегировать эти задачи набору более специализированных компонентов. –