Java with Services 中的多态性



我是面向对象编程的新手。我想根据从 UI 请求收到的 EnumType 创建电子邮件正文。

例如,如果我收到枚举值 A,我需要使用从数据库和其他服务接收的一些属性构建一个电子邮件正文。如果枚举值不同,我需要不同的行为。

我尝试创建

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.
}

现在,我如何使用电子邮件服务接口,并根据请求中的枚举值在运行时将其替换为AEmailService或BEmailService的对象。

这样做更好

吗?

你可以用Supplier<EmailService>来参数化你的enum,例如:

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();
    }
}

根据您作为输入获得的枚举值,您只需调用get即可获得所需的实例。

如果我理解这个问题,像这样:

EmailService emailSrvc;
switch (myEnum) {
  case AEMAIL:
    emailSrvc = new AEmailService();
    break;
  case BEMAIL:
     emailSrvc = new BEmailService();
     break;
}
String body emailSrvc.getBody();
...

你可以试试策略模式

inteface EmailStrategy {
}

定义不同的策略

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

您的电子邮件服务可以是具体的类,并将包含电子邮件策略接口

class EmailService{
EmailStrategy strategy;
}

当您收到枚举值时,您可以简单地为此字段设置匹配策略并调用操作方法

最简单的方法,使用 if-else 条件:

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

基本上,您需要一个接口类型的对象,然后根据您想要的任何内容使用该接口的具体实现来实例化它。

我进行编辑以添加使用工厂模式封装更多先前行为的可能性:

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
}

最新更新