728x90
반응형
Facade Pattern
복잡한 서브 시스템 의존성을 최소화하는 방법
클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화
BEFORE
Client
- 기존의 클라이언트를 보면 발송정보, 메일 내용, 보내는 로직 등이 모두 하나의 코드에 의존적이다.
public class Client {
public static void main(String[] args) {
String to = "keesun@whiteship.me";
String from = "whiteship@whiteship.me";
String host = "127.0.0.1";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Test Mail from Java Program");
message.setText("message");
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
AFTER
Client
- EmailMessage, EmailSender, EmailSettings로 의존성을 분리한다.
- 특히 여러 곳에서 이메일을 보내는 로직이 필요하다면 이와 같은 퍼사드 패턴의 유연함을 더욱 느낄 수 있다.
public class Client {
public static void main(String[] args) {
EmailSettings emailSettings = new EmailSettings();
emailSettings.setHost("127.0.0.1");
EmailSender emailSender = new EmailSender(emailSettings);
EmailMessage emailMessage = new EmailMessage();
emailMessage.setFrom("keesun");
emailMessage.setTo("whiteship");
emailMessage.setCc("일남");
emailMessage.setSubject("오징어게임");
emailMessage.setText("밖은 더 지옥이더라고..");
emailSender.sendEmail(emailMessage);
}
}
EmailSettings
public class EmailSettings {
private String host;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}
EmailSender
public class EmailSender {
private EmailSettings emailSettings;
public EmailSender(EmailSettings emailSettings) {
this.emailSettings = emailSettings;
}
/**
* 이메일 보내는 메소드
* @param emailMessage
*/
public void sendEmail(EmailMessage emailMessage) {
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", emailSettings.getHost());
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailMessage.getFrom()));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(emailMessage.getTo()));
message.addRecipient(Message.RecipientType.CC, new InternetAddress(emailMessage.getCc()));
message.setSubject(emailMessage.getSubject());
message.setText(emailMessage.getText());
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
EmailMessage
public class EmailMessage {
private String from;
private String to;
private String cc;
private String bcc;
private String subject;
private String text;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public String getBcc() {
return bcc;
}
public void setBcc(String bcc) {
this.bcc = bcc;
}
}
[패턴 복습]
장점 | 단점 |
- 서브 시스템에 대한 의존성을 한 곳으로 모일 수 있다. - 가독성이 좋다. |
- 퍼사트 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다. |
[실무에서 쓰이는 경우]
- 스프링
- Spring MVC
- 스프링이 제공하는 대부분의 기술 독립적인 인터페이스와 그 구현체
728x90
반응형
'Design Patterns > 구조(Structural)' 카테고리의 다른 글
[Proxy]프록시패턴 (0) | 2022.10.19 |
---|---|
[Flyweight]플라이웨이트패턴 (0) | 2022.10.18 |
[Decorator]데코레이터패턴 (0) | 2022.08.01 |
[Composite]컴포짓패턴 (0) | 2022.08.01 |
[Bridge]브릿지패턴 (0) | 2022.08.01 |