ACTUALIZADO: Se ha agregado una pregunta más (Pregunta 4).Emailer en Java con el Patrón de estrategia
Hola a todos,
Estoy construyendo mi mismo una costumbre enviando un correo electrónico de servicios públicos. Ahora, para obedecer el Principio de Responsabilidad Individual, quiero tener las siguientes clases: MailerSender, MailProvider y EmailObject. El MailSender es más de un delegado, echa un vistazo a continuación:
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
}
}
}
la MailSender requiere un proveedor de correo electrónico IMailProvider que hace el trabajo de enviar el correo electrónico. Encontrar a continuación:
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
}
}
he definido algunas estrategias anteriormente, pero puede extenderse a cualquier número. Dado que MailSender puede cambiar su proveedor en cualquier momento, efectivamente implementa el patrón de estrategia ¿verdad?
El EmailObject es un POJO que contiene la información de correo electrónico relavent:
public class EmailObject {
private String to;
private String from;
private String cc;
private String subject;
private String body;
// setters and getters for all
}
El código de cliente será el siguiente aspecto:
MailSender sender = new MailSender(new SMTPMailProvider());
sender.send(new EmailObject());
sender.setMailProvider(new JMSMailProvider());
sender.send(new EmailObject());
Mis preguntas son:
1. Tener he implementado el patrón de estrategia ?
2. ¿Es este diseño bueno? ¿Tiene sentido que un proveedor de correo tenga conocimiento de un EmailObject?
3. ¿Qué pasa si tengo un nuevo EmailObject más tarde que requiere un archivo adjunto?
4. El código del cliente ahora necesita adquirir un MailProvider específico antes de crear un MailSender ... ¿tiene sentido esto?
+1 para esta afirmación: "De cualquier forma, los patrones de diseño están destinados a ayudarlo a pensar, no a bloquearlo con un nombre específico". Me tomó un tiempo aprender que: ^) – bedwyr
Estoy tratando de encontrar una buena manera de hacer esto. El MailerSender obtiene una interfaz de EmailObject en lugar de una clase concreta, ¿cómo puede el proveedor "obtener" la información? La interfaz proporcionará un contrato para la información en la clase concreta, pero ¿qué sucederá cuando creo un nuevo objeto con _added_ información? En el caso de un correo electrónico básico (a, desde, cc, asunto, cuerpo) versus un correo electrónico con datos adjuntos (byte [])? – djunforgetable
Debe determinar qué correo electrónico tiene cada proveedor con el que esté familiarizado y ofrecer getters en la interfaz. Por lo general, se espera que los proveedores solo se ocupen de los correos electrónicos, por lo que debe ingresar todo lo que necesite en el correo electrónico. – Uri