JAVA
[디자인패턴] façade 패턴
gom1n
2022. 5. 12. 15:20
Facade 패턴
교수님이 이걸 페싸-드 라고 읽어야한대서 너무 웃겼다. 페케이드라고 하면 절대 안된단다.
페싸-드를 무한반복하시는.. 웃참 강의

페싸-드 패턴을 아주 잘 설명해주는 그림이다.
= 복잡한 내부는 숨기고, 높은 레벨의 API를 외부에 제공한다.
예제)
Facade 패턴을 활용해 제공받은 이메일로 웹페이지를 만드는 간단한 프로그램이다.
소스파일 디렉터리 구조는 이러하다.

다이어그램)
PageMaker 클래스가 Facade역할을 한다.

알아둘 점)
Facade 패턴 또한 재귀적인 구조가 가능하다.
하나의 창구는 또 다른 하나의 서브시스템이 될 수 있다는 말이다.
연습문제
15-1) 클래스 설계자는 미래의 확장이나 프로그램의 개선에 대비해서 PageMaker 클래스만을 pagemaker 패키지의 외부에서 이용할 수 있도록 만드려고 합니다. Database 클래스의 HtmlWriter 클래스를 pagemaker 패키지의 외부에서 이용할 수 없도록 하기 위해서는 예제프로그램을 어떻게 변경해야합니까?
두 클래스 앞의 public을 없앤다.
디폴트 상태의 클래스는 같은 package 내부에서만 접근이 가능하다.
15-2) maildata.txt에 포함되어있는 사용자의 메일 주소의 링크페이지를 작성하는 makeLinkPage 메소드를 추가해주십시오.
main에서의 활용
public class Main {
public static void main(String[] args) {
PageMaker.makeLinkPage("linkPage.html");
}
}
답)
package pagemaker;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Enumeration;
public class PageMaker {
private PageMaker() {
}
public static void makeWelcomePage(String mailaddr, String filename) {
try {
Properties mailprop = Database.getProperties("maildata");
String username = mailprop.getProperty(mailaddr);
HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
writer.title("Welcome to " + username + "'s page!");
writer.paragraph(username + "의 페이지에 오신걸 환영합니다.");
writer.paragraph("메일을 기다리고 있습니다.");
writer.mailto(mailaddr, username);
writer.close();
System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void makeLinkPage(String filename) {
try {
HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
writer.title("Link page");
Properties mailprop = Database.getProperties("maildata");
Enumeration en = mailprop.propertyNames();
while (en.hasMoreElements()) {
String mailaddr = (String)en.nextElement();
String username = mailprop.getProperty(mailaddr, "(unknown)");
writer.mailto(mailaddr, username);
}
writer.close();
System.out.println(filename + " is created.");
} catch (IOException e) {
e.printStackTrace();
}
}
}