更新:又增加了一个问题(问题#4)。
大家好,
我正在为自己构建一个自定义电子邮件实用程序。现在,为了遵守单一职责原则,我想要以下类:MailerSender、MailProvider 和 EmailObject。MailSender 更像是一个代表,请查看以下内容:
public class MailSender {
private IMailProvider mailProvider;
public void setMailProvider (IMailProvider provider) {
this.mailProvider = provider;
}
// option to set it up during construction
public MailSender (IMailProvider provider) {
this.mailProvider = provider;
}
public void sendEmail(EmailObject obj) {
if(mailProvider == null)
throw new RuntimeException("Need a mail provider to send email.");
try {
mailProvider.send(obj);
} catch (Exception e) {
// do something here
}
}
}
MailSender 需要一个 IMailProvider 电子邮件提供商来完成发送电子邮件的工作。在下面找到它:
public interface IMailProvider {
public void sendEmail(EmailObject obj);
}
public class SMTPEmailProvider implements IMailProvider {
public void sendEmail(EmailObject obj) {
// use SMTP to send email using passed-in config
}
}
public class JMSEmailProvider implements IMailProvider {
public void sendEmail(EmailObject obj) {
// push emails to JMS queue to be picked up by another thread
}
}
我在上面定义了一些策略,但它可以扩展到任何数量。由于 MailSender 可以随时更改它的提供者,它有效地实现了策略模式,对吧?
EmailObject 是一个包含相关电子邮件信息的 POJO:
public class EmailObject {
private String to;
private String from;
private String cc;
private String subject;
private String body;
// setters and getters for all
}
客户端代码将如下所示:
MailSender sender = new MailSender(new SMTPMailProvider());
sender.send(new EmailObject());
sender.setMailProvider(new JMSMailProvider());
sender.send(new EmailObject());
我的问题是:
1. 我是否实施了策略模式?
2、这个设计好不好?MailProvider 知道 EmailObject 是否有意义?
3. 如果我以后有一个新的 EmailObject 需要附件怎么办?
4. 客户端代码现在需要在创建 MailSender 之前获取特定的 MailProvider ......这有意义吗?