已更新:增加了一个问题(问题#4)。Java中使用策略模式的Emailer
大家好,
我正在建立一个自定义的电子邮件实用程序。现在,要遵守单一责任原则,我想要有以下类: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是包含relavent电子邮件信息的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 ......这是否有意义?
+1对于本声明:“无论哪种方式,设计模式都是为了帮助您思考,而不是锁定您的具体名称。”我花了一段时间才知道:^) – bedwyr 2009-05-18 00:51:27
我试图找出一个很好的方法来做到这一点。 MailerSender获得一个EmailObject接口而不是一个具体的类,提供者如何“获取”信息?该接口将为具体类中的信息提供合约,但是当我使用_added_信息创建新对象时会发生什么? 对于基本电子邮件(来自cc,subject,body)与带有附件(byte [] data)的电子邮件的情况? – djunforgetable 2009-05-18 01:28:52