티스토리 뷰
728x90
1. 의미
- facade 사전적 의미 → (건물의) 정면; 앞면.
- 복잡한 서브 시스템(라이브러리, 프레임워크) 의존성을 최소화하는 방법
- 모든 기능들을 숨긴다
- 특정한 기능을 감싸고 있는 인터페이스
- 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화
- 복잡한 클래스나 메소드를 클라이언트가 직접 사용하지 않고 우리가 만든 facade 만을 이용하도록 함
2. 작성방법
- 아래 메일 전송 샘플 코드를 퍼사드 패턴으로 적용해본다.
2.1. 적용전
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();
}
}
}
2.2 적용후
- 처음에 작성한 client 소스가 결국엔 EmailSender 안으로 옮겨진 것 뿐 이지만 코드 가독성 및 재사용성이 높아짐.
@Data
public class EmailSettings {
private String host;
}
@Data
public class EmailMessage {
private String from;
private String to;
private String cc;
private String bcc;
private String subject;
private String text;
}
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();
}
}
}
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);
}
}
3. 장단점
3.1. 장점
- 복잡한 서브 시스템 의존성을 최소화 하는 패턴
- 서브 시스템에 대한 의존성을 한 곳으로 모아 관리
- 소스 읽기가 편함
3.2. 단점
- 퍼사드 클래스가 서브 시스템의 모든 의존성을 갖고 있음
- 서브 시스템의 의존성은 피할 수 없음
728x90
'디자인 패턴' 카테고리의 다른 글
12. 프록시 패턴 (0) | 2022.02.10 |
---|---|
11. 플라이 웨이트 패턴 (0) | 2022.02.10 |
09. 데코레이터 패턴 (0) | 2022.02.10 |
08. 컴포짓 패턴 (0) | 2022.02.10 |
07. 브릿지 패턴 (0) | 2022.02.10 |
댓글