AKTUALISIERT: Eine weitere Frage hinzugefügt (Frage # 4).Emailer in Java mit Strategie Muster
Hallo,
Ich baue mir eine eigene E-Mail-Programm. Nun, um das Prinzip der einfachen Verantwortlichkeit zu erfüllen, möchte ich die folgenden Klassen haben: MailerSender, MailProvider und EmailObject. Der Mailsender mehr eines Delegierten, überprüfen Sie es unten aus:
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
}
}
}
Der Mailsender erfordert eine IMailProvider E-Mail-Anbieter, der die Arbeit des Sendens der E-Mail der Fall ist. Finden Sie es unter:
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
}
}
Ich habe ein paar Strategien oben definiert, aber es kann zu jeder Zahl erweitert werden. Da der MailSender seinen Provider jederzeit wechseln kann, implementiert er das Strategie-Pattern richtig?
Die EmailObject ist ein POJO relavent E-Mail-Informationen enthält:
public class EmailObject {
private String to;
private String from;
private String cc;
private String subject;
private String body;
// setters and getters for all
}
Client-Code wird dann wie folgt aussehen:
MailSender sender = new MailSender(new SMTPMailProvider());
sender.send(new EmailObject());
sender.setMailProvider(new JMSMailProvider());
sender.send(new EmailObject());
Meine Fragen sind:
1. Habe ich das Strategy-Muster umgesetzt ?
2. Ist dieses Design gut? Ist es für einen MailProvider sinnvoll, auf ein EmailObject zu achten?
3. Was wäre, wenn ich später ein neues EmailObject hätte, das einen Anhang benötigt?
4. Der Client-Code muss jetzt einen bestimmten MailProvider erhalten, bevor er einen MailSender erstellt ... macht das Sinn?
+1 für diese Aussage: "Wie auch immer, Entwurfsmuster sollen Ihnen helfen zu denken, nicht Sie an einen bestimmten Namen zu sperren." Ich brauchte eine Weile, um das zu lernen: ^) – bedwyr
Ich versuche, einen guten Weg zu finden, dies zu tun. Der MailerSender bekommt eine EmailObject-Schnittstelle statt einer konkreten Klasse, wie kommt der Provider auf die Informationen? Die Schnittstelle liefert einen Vertrag für die Informationen in der konkreten Klasse, aber was passiert, wenn ich ein neues Objekt mit _added_ Informationen erstelle? Im Falle einer grundlegenden E-Mail (an, von, cc, Betreff, Körper) im Vergleich zu einer E-Mail mit einem Anhang (Byte [] Daten)? – djunforgetable
Sie müssen feststellen, was eine E-Mail hat, mit der jeder Anbieter vertraut ist, und Getter in der Schnittstelle anbieten. Von den Providern kann im Allgemeinen nur erwartet werden, dass sie mit E-Mails umgehen, also müssen Sie in die E-Mail alles eintragen, was Sie benötigen. – Uri