2017-06-22 148 views
0

我创建了一个名为email-util.jar的实用程序jar文件。该实用程序的主要目的是通过Amazon SES或Gmail SMTP发送电子邮件。我使用工厂模式来决定电子邮件的类型。 (电子邮件util.jar将在多个项目中使用)如何覆盖java变量并将变量设置为必填字段

EmailService.java(接口)

public Status sendEmail(Email emailVO) 

实现亚马逊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 ... ..所有电子邮件相关的信息驻留在EmailVO。 使用工厂模式我能够创建AWS或Gmail的对象并成功发送电子邮件。

现在我已经在其相应的实现中对亚马逊SES和Gmail的所有配置进行了硬编码。亚马逊和Gmail的配置信息有点不同。

的Gmail

  • SMPT主机
  • SMTP端口 ...

亚马逊SES

  • awsAccessKey
  • awsSecretKey
  • 区域
  • connectionTimeout
  • MAXCONNECTIONS
  • 了socketTimeout
  • maxErrorRetry ...。

但我不希望配置信息被硬编码。我为sendEmail方法引入了一个附加参数。

public Status sendEmail(Email emailVO, EmailConfig config) 

EmailConfig是一个简单的bean,我有整个亚马逊和gmail相关的变量。一切工作正常。但我有一些顾虑

Quesions

  1. 有没有我们可以分开亚马逊SES配置和Gmail的相关配置的一种方式。
  2. 还有一个问题是用户不知道哪些变量是必需的,哪些变量是可选的。即如果用户选择gmail,则Region是可选的。如何解决这个问题
  3. 这解决了这个问题

我试图创建一个名为EmailConfig一个标记接口,并创建了执行EmailConfig两个班的任何设计模式。

AmazonSESConfig implements EmailConfig 
amazonSES related variables. 

GmailConfig implements EmailConfig 
gmail related variables. 

但它没有奏效。由于它是标记界面,因此无法将Email中的AmazonSES/Gmail的对象存储在EmailConfig中。

+0

从阅读'override'和'core'标签的描述,我不认为这些标签在这里是适当的。 – CollinD

+0

如果用户不知道正在使用哪个服务,并且该服务不控制正在创建的“Email”实例,则所需字段是所有必填字段的联合。没有别的可能的工作。 –

回答

0

隐藏关于用户的特定EmailService实现的知识,包含实现类中的所有配置并通过工厂给用户具体实现。

class EmailServiceFactory { 

     public EmailService getService() {}  

} 

和你没有改变这个方法的签名

interface EmailService { 

    public Status sendEmail(Email email); 

} 
1

有没有我们可以分开亚马逊SES配置和Gmail 相关配置的一种方式。

您可以有两个不同的类返回配置值,但由于这两个提供者不依赖于相同的需求,您应该明确地使用这些类。

并具有共同的基类,你试过没有任何意义:

public Status sendEmail(Email emailVO, EmailConfig config) 

你应该有亚马逊一类和其他类的Gmail每一个不同的方法:

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

还有一个问题是用户不知道哪些变量是强制性的,而哪些变量是可选的。即如果用户选择gmail,则区域 是可选的。如果你使用Gmail的用户不同的配置类,另一个用于亚马逊如何解决这个问题

,您可以方便地查看所有必填字段都在运行时所重视。
每个实现都可以执行自己的检查。

如果您想在编译时发现问题,可以使用步骤生成器来强制客户端填写所有必填字段。

你可以有一些为:

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

其中awsAccessKey()会返回一个包含awsSecretKey()方法的接口的实例。 awsSecretKey()方法将返回包含region()方法的接口实例。对于...

如果强制字段未被赋值,则客户端无法调用构建方法,因为只有最后一个字段才会返回提供了方法build()方法的接口实例。