ОБНОВЛЕНО: Добавлен еще один вопрос (Вопрос № 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. Теперь клиентскому коду необходимо получить определенный MailProvider перед созданием MailSender ... имеет ли это смысл?