我创建了一个名为email-util.jar的实用程序jar文件。该实用程序的主要目的是通过Amazon SES或Gmail SMTP发送电子邮件。我使用工厂模式来决定电子邮件类型。 (email-util.jar将在多个项目中使用)
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的对象并成功发送电子邮件。
目前我已经在相应的实施中硬编码了Amazon SES和Gmail的所有配置。亚马逊和Gmail的配置信息略有不同。
的Gmail
亚马逊SES
但我不希望硬编码配置信息。我向sendEmail方法引入了一个额外的参数。
public Status sendEmail(Email emailVO, EmailConfig config)
EmailConfig是一个简单的bean,我有整个亚马逊和gmail相关的变量。一切都很好。但我没有什么顾虑
Quesions
我尝试创建一个名为EmailConfig的标记接口,并创建了两个实现EmailConfig的类。
AmazonSESConfig implements EmailConfig
amazonSES related variables.
GmailConfig implements EmailConfig
gmail related variables.
但它没有成功。无法在EmailConfig中存储AmazonSES / Gmail的对象,因为它是一个标记界面。
答案 0 :(得分:1)
我们是否可以将Amazon 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,那么Region 是可选的。如何解决这个问题
如果您为gmail使用不同的配置类,而为amazon使用另一个配置类,则可以轻松检查所有必填字段是否在运行时被评估。
每个实施都可以自己检查。
如果要在编译时捕获问题,可以使用步骤构建器强制客户端填写所有必填字段。
您可以拥有以下内容:
AmazonSESConfig amazonConfig =
AmazonSESConfig.Builder().awsAccessKey(access).awsSecretKey(secret).region(region)...build();
其中awsAccessKey()
将返回包含awsSecretKey()
方法的接口的实例。 awsSecretKey()
方法将返回包含region()
方法的接口实例。所以...
如果未对必填字段进行评估,则客户端无法调用构建方法,因为只有最后一个字段值将返回提供build()
方法的接口实例。
答案 1 :(得分:0)
从用户隐藏有关特定EmailService
实现的知识,包含实现类中的所有配置,并通过工厂为用户提供具体实现。
class EmailServiceFactory {
public EmailService getService() {}
}
并且您不必更改此方法签名
interface EmailService {
public Status sendEmail(Email email);
}