更新:もう1つの質問を追加しました(質問#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.クライアントコードは、MailSenderを作成する前に特定のMailProviderを取得する必要があります...これは意味がありますか?