Я создаю систему электронной почты для фреймворка, который разрабатываю. До сих пор у меня есть общий интерфейс MailMessage, который будет реализовывать каждый тип почтового сообщения, что-то вроде
public interface MailMessage {
public String[] getTo();
public void setTo(String[] to);
public String getFrom();
public void setFrom(String from);
...
// you can guess the setters/getters here
...
}
Затем я получил SimpleMailMessage, это именно то, что вы ожидаете, как простую реализацию интерфейса (без шифрования или кодирования, просто текст).
Я создал интерфейс MailMessageFactory, который используется в качестве абстрактной фабрики. У меня есть SimpleMailMessageFactory, который реализует фабрику для создания экземпляров SimpleMailMessage.
Одним типом электронного письма, которое я хотел бы отправить платформе, является почтовое сообщение Alert, которое по сути является обычным почтовым сообщением, за исключением префикса «[Alert]» в строке темы (другим может быть электронное письмо, содержащее list "элементов заказа, но я не уверен, куда ложится ответственность за преобразование списка в строку для электронной почты). Я могу либо создать подкласс SimpleMailMessage, либо переопределить метод setSubject (String subject) на что-то вроде
public class AlertMailMessage {
...
public void setSuject(String subject) {
this.to = "[Alert]" + to;
}
...
}
Или я могу создать декоратор:
public abstract class EmailDecorator implements MailMessage {
protected MailMessage email;
...
// delegate all implemented methods to email
...
}
public class AlertEmailDecorator extends EmailDecorator {
public void setSubject(String subject) {
email.setSubject("[Alert]" + subject);
}
}
Или я могу просто делегировать добавление строки "[Alert]" в SimpleMailMessageFactory.
Мысли о том, что у меня есть? Думаю, проблема в том, что я могу быть слишком вдумчивым и дальновидным, но я хочу идеальный дизайн.