如何覆盖Java变量并将变量作为强制性字段



我创建了一个名为email-util.jar的实用程序JAR文件。该实用程序的主要目的是通过Amazon SES或Gmail SMTP发送电子邮件。我已经使用工厂模式来决定电子邮件类型。(email-util.jar将用于多个项目(

emailservice.java(接口(

public Status sendEmail(Email emailVO)

Amazon SES

实现
public class AmazonSimpleEmailServiceImpl implements EmailService {
public Status sendEmail(Email emailVO)
{
Amazon related stuff
}

Gmail的实现

public class GmailServiceImpl implements EmailService {
public Status sendEmail(Email emailVO)
{
Gmail related stuff
}

emailvo 将有toaddress,fromaddress…..所有相关信息都位于电子邮件中。使用工厂模式,我能够创建AWS或Gmail的对象,并成功发送电子邮件。

现在,我已经在其相应的实现中进行了硬编码Amazon SES和Gmail的所有配置。Amazon和Gmail的配置信息几乎没有不同。

gmail

  • SMPT主机
  • SMTP端口…

Amazon Ses

  • awsaccesskey
  • awssecretkey
  • 区域
  • Connection Timeout
  • maxConnections
  • sockettimeout
  • maxorrertry…。

,但我不希望配置信息被硬编码。我向Sendemail方法介绍了一个其他参数。

public Status sendEmail(Email emailVO, EmailConfig config)

emailconfig是一个简单的豆子,我拥有整个亚马逊和Gmail相关的变量。一切正常。但是我很少担心

问题

  1. 有什么方法可以将Amazon SES配置和与Gmail相关的配置分开。
  2. 另一个问题是用户不知道哪些变量是强制性的,哪些变量是可选的。IE。如果用户选择Gmail,则区域是可选的。如何解决这个问题
  3. 任何解决此问题的设计模式

我尝试创建一个称为emailconfig的标记界面,并创建了两个实现电子邮件config的类。

AmazonSESConfig implements EmailConfig
amazonSES related variables.
GmailConfig implements EmailConfig
gmail related variables.

但没有解决。由于它是标记接口,因此无法将Amazons/Gmail的对象存储在电子邮件中。

有什么方法可以分开Amazon SES配置和Gmail 相关配置。

您可以有两个不同的类返回配置值,但是由于这两个提供商不依赖相同的要求,因此您应该明确使用此类。

您尝试过的普通基类是没有道理的:

public Status sendEmail(Email emailVO, EmailConfig config)

您应该为Amazon有一个类,而Gmail的另一堂课则是一个独特的方法:

public Status sendEmail(Email emailVO, AmazonSESConfig config)
     ...
public Status sendEmail(Email emailVO, GmailConfig config)

另一个问题是用户不知道哪些变量是强制性的,并且 哪些变量是可选的。IE。如果用户选择Gmail,则区域 是可选的。如何解决这个问题

如果您为gmail使用独特的配置类,另一个用于亚马逊,则可以轻松地检查所有必需的字段是否在运行时重视。
每个实现都可以自己检查。

如果您想在编译时遇到问题,则可以使用阶梯构建器迫使客户填充所有必需的字段。

您可以有:

AmazonSESConfig amazonConfig = 
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();

awsAccessKey()将返回包含awsSecretKey()方法的接口实例。awsSecretKey()方法将返回包含region()方法的接口的实例。所以...

如果不重视强制性字段,则客户端无法调用构建方法,因为只有最后一个字段将返回一个提供build()方法的接口实例。

隐藏有关从用户实现特定EmailService的知识,使实现类中的所有配置都不符合,并通过工厂为用户具体实现提供。

 class EmailServiceFactory {
      public EmailService getService() {}      
 }

,您不必更改此方法签名

interface EmailService {
    public Status sendEmail(Email email); 
}

最新更新