ОБНОВЛЕНО: Добавлен еще один вопрос (вопрос № 4).Emailer в Java с использованием шаблона стратегии
Привет всем,
Я строю себе обычай отправки по электронной почте утилиты. Теперь, чтобы подчиняться принципу единой ответственности, я хочу иметь следующие классы: 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, содержащий relavent информацию по электронной почте:
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 ... это имеет смысл?
+1 для этого утверждения: «В любом случае, шаблоны проектирования призваны помочь вам думать, а не блокировать вас определенным именем». Мне потребовалось некоторое время, чтобы узнать, что: ^) – bedwyr
Я пытаюсь найти хороший способ сделать это. MailerSender получает интерфейс EmailObject вместо конкретного класса, как провайдер «получает» информацию? Интерфейс предоставит контракт для информации в конкретном классе, но что произойдет, когда я создам новый объект с информацией _added_? В случае основного электронного письма (в, из, cc, subject, body) по сравнению с электронным письмом с вложением (байт [])? – djunforgetable
Вы должны определить, что такое электронная почта, с которой каждый поставщик знаком и предлагает геттеры в интерфейсе. Поставщиков, как правило, можно ожидать, что они будут иметь дело с электронными письмами, поэтому вам нужно будет поместить в электронное письмо все, что вам нужно. – Uri