【发布时间】:2017-11-26 06:35:20
【问题描述】:
我创建了一个名为 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..... 所有与电子邮件相关的信息都驻留在 EmailVO 中。 使用工厂模式,我可以创建 AWS 或 Gmail 的对象并成功发送电子邮件。
现在,我已将 Amazon SES 和 Gmail 的所有配置硬编码到相应的实现中。 Amazon 和 Gmail 的配置信息差别不大。
Gmail
- Smpt 主机
- SMTP 端口 …
亚马逊 SES
- awsAccessKey
- awsSecretKey
- 地区
- 连接超时
- 最大连接数
- 套接字超时
- maxErrorRetry ....
但我不希望配置信息被硬编码。我为 sendEmail 方法引入了一个附加参数。
public Status sendEmail(Email emailVO, EmailConfig config)
EmailConfig 是一个简单的 bean,我拥有整个 amazon 和 gmail 相关变量。一切正常。但我没有什么顾虑
问题
- 有没有一种方法可以将 Amazon SES 配置和 Gmail 相关配置分开。
- 另一个问题是用户不知道哪些变量是必需的,哪些变量是可选的。 IE。如果用户选择 gmail,则 Region 是可选的。如何解决这个问题
- 解决此问题的任何设计模式
我尝试创建一个名为 EmailConfig 的标记接口,并创建了两个实现 EmailConfig 的类。
AmazonSESConfig implements EmailConfig
amazonSES related variables.
GmailConfig implements EmailConfig
gmail related variables.
但是没有成功。无法将 AmazonSES/Gmail 的对象存储在 EmailConfig 中,因为它是一个标记接口。
【问题讨论】:
-
通过阅读
override和core标签描述,我认为这些标签在这里不合适。 -
如果用户不知道正在使用哪个服务,并且该服务不控制正在创建的
Email的实例,则必填字段是所有必填字段的并集。没有其他方法可以工作。
标签: java variables inheritance design-patterns overriding