업데이트 : 질문 4 개를 추가했습니다.전략 패턴을 사용하는 Java의 Emailer
안녕 모두,
나는 사용자 정의 이메일 유틸리티를 구축하고 있습니다. 이제 Single Responsibility Principle을 따르기 위해 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는 언제든지 공급자를 변경할 수 있으므로 전략 패턴을 효과적으로 구현합니다.
MailSender sender = new MailSender(new SMTPMailProvider());
sender.send(new EmailObject());
sender.setMailProvider(new JMSMailProvider());
sender.send(new EmailObject());
내 질문
은 다음과 같습니다 :1.
내가 전략 패턴을 구현 한
public class EmailObject {
private String to;
private String from;
private String cc;
private String subject;
private String body;
// setters and getters for all
}
클라이언트 코드는 다음과 같이 표시됩니다
EmailObject은 relavent 이메일 정보를 포함하는 POJO이다 ?
2.이 디자인이 좋은가요? MailProvider가 EmailObject를 인식하는 것이 합리적입니까?
3. 첨부 파일이 필요한 새 EmailObject를 나중에 만들었습니까?
4. 이제 MailSender를 만들기 전에 클라이언트 코드가 특정 MailProvider를 가져와야합니다.이 말이 맞는가요?
+1이 진술에 대해 : "어느 쪽이든, 디자인 패턴은 생각을 돕기위한 것이지 특정 이름으로 고정시키는 것이 아닙니다." 그것을 배우는 데는 어느 정도 시간이 걸렸습니다 : ^) – bedwyr
나는 이것을 할 수있는 좋은 방법을 찾으려고 노력하고 있습니다. MailerSender는 구체적인 클래스 대신 EmailObject 인터페이스를 사용합니다. 공급자는 정보에 어떻게 접근합니까? 인터페이스는 구체적인 클래스의 정보에 대한 계약을 제공하지만 _added_ 정보로 새 객체를 만들면 어떻게됩니까? 첨부 파일이있는 전자 메일 (바이트 [] 데이터)과 기본 전자 메일 (to, cc, subject, body)의 경우? – djunforgetable
모든 공급자가 익숙한 이메일을 결정하고 인터페이스에서 getter를 제공해야합니다. 공급자는 일반적으로 전자 메일 만 처리 할 수 있으므로 전자 메일에 필요한 모든 것을 입력해야합니다. – Uri