Полиморфизм в Java с сервисами - PullRequest
0 голосов
/ 13 июня 2019

Я новичок в объектно-ориентированном программировании.Я хочу создать тело письма на основе EnumType, который я получаю из запроса от пользовательского интерфейса.

Например, если я получаю значение Enum A, мне нужно создать тело письма с некоторыми атрибутами, которые я получу отбаза данных и другие услуги.Мне нужно другое поведение, если значение Enum отличается.

Я пытался создать

public interface EmailService {
  String getBody();
  String getStatus();
}

public class AEmailService implements EmailService {
  Service X;
  DAOService Y;

   .... Some operations.

}

public class BEmailService implements EmailService {
  Service X;
  DAOService Y;
   .... Some operations.

}

Теперь, как я могу использовать интерфейс EmailService и заменить его объектами AEmailService или BEmailService навремя выполнения, основанное на значении enum в запросе.

Что лучше сделать для этого?

Ответы [ 4 ]

2 голосов
/ 13 июня 2019

Вы можете параметризовать ваш enum с помощью Supplier<EmailService>, например:

public enum EmailServiceTypes {

    A(AEmailService::new),
    B(BEmailService::new);//etc

    private Supplier<EmailService> supplier;
    EmailServiceTypes(Supplier<EmailService> supplier) {
        this.supplier = supplier;
    }

    public EmailService supply() {
        return supplier.get();
    }
}

На основании значения enum, которое вы получаете в качестве ввода, вам просто нужно вызвать get и выПолучу нужный экземпляр.

0 голосов
/ 13 июня 2019

Вы можете попробовать шаблон стратегии

inteface EmailStrategy {
}

Определить различные стратегии

StrategyA implements EmailStrategy{ some actions}
StrategyB implements EmailStrategy{ some actions}

Ваш EmailService может быть конкретным классом и содержать EmailStrategyInterface

class EmailService{
EmailStrategy strategy;
}

Когда выбудет получать значение перечисления, вы можете просто установить соответствующую стратегию для этого поля и вызвать методы действия

0 голосов
/ 13 июня 2019

Если я понял вопрос, что-то вроде:

EmailService emailSrvc;
switch (myEnum) {
  case AEMAIL:
    emailSrvc = new AEmailService();
    break;
  case BEMAIL:
     emailSrvc = new BEmailService();
     break;

}

String body emailSrvc.getBody();

...
0 голосов
/ 13 июня 2019

Самый простой способ сделать это с условием if-else:

EmailService mEmailService;
if (receivedEnum == EnumType.WHATEVER) {
    mEmailService = new AEmailService();
} else {
    mEmailService = new BEmailService();
}

По сути, вам нужен объект типа интерфейса, и вы создаете его экземпляр с конкретной реализацией этого интерфейса в зависимости от того, что вы хотите.

Я редактирую, чтобы добавить возможность еще более инкапсулировать предыдущее поведение с FactoryPattern:

public class EmailServiceFactory {

    public static EmailService getEmailService(EmailEnum enum) {
        switch (enum) {
            case EMAIL_TYPE_A:
                return new AEmailService();
            case EMAIL_TYPE_B:
                return new BEmailService();
        }
    }
}

public static void main(String[] args) {

   EmailService mEmailService = EmailServiceFactory.getEmailService(EMAIL_TYPE_A);
   mEmailService.getBody(); // This will call getBody() from AEmailService class

   mEmailService = EmailServiceFactory.getEmailService(EMAIL_TYPE_B);
   mEmailService.getBody(); // This will call getBody() from BEmailService class

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...