Facade Pattern = 창구 역할
복잡한 클래스들 간 관계를 이 메서드를 호출하는 클라이언트 대신에 하나의 메서드로 묶어주는 패턴입니다. 목적은 클라이언트 입장에서 메서드를 호출하는 횟수를 줄이는 것 입니다.
여기서 클라이언트는 메서드를 호출하는 주체입니다.
예시
예를 들어 "이메일과 파일명을 주면 html 확장자인 웰컴페이지를 만들어줘!" 라는 기능을 만든다고 합시다. 그러면 클라이언트 입장에서는 makeWelcomePage(mailaddr, filename) 을 호출하고 html 파일만 생성되는 것이 편리합니다. 그 안에서 세부적인 다른 클래스의 메서드 호출 순서를 알아서 처리해주기 때문입니다.

코드 예제
PageMaker 클래스
창구 역할을 하는 Facade 역할
package part15_facade.pagemaker;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
// fascade 역할
// 이메일 주소로 사용자의 웹페이지를 작성하는 클래스
public class PageMaker {
// Database 클래스와 HtmlWriter 클래스를 조합하여 지정한 사용자의 웹페이지를 만든다
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(username + "'s web page");
writer.paragraph("Welcome to " + username + "'s web page!");
writer.mailto(mailaddr, username);
writer.close();
System.out.println(filename = " is created for " + mailaddr + " (" + username + ")");
}catch (IOException e) {
e.printStackTrace();
}
}
}
Database 클래스
데이터베이스 이름을 제공하면 그 안에 Properties 를 생성한다. (String, String) 형식으로 되어있다.
package part15_facade.pagemaker;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
// 이메일 주소에서 사용자 이름을 얻는 클래스
public class Database {
private Database() {
}
// 데이터베이스 이름에서 Properties를 얻는다.
public static Properties getProperties(String dbname) throws IOException {
String filename = "src/part15_facade/pagemaker/" + dbname + ".txt"; // 파일 경로를 지정해줘야함. working directory 기준으로 잡으면 out 폴더 안에서 진행
Properties prop = new Properties();
prop.load(new FileReader(filename));
return prop;
}
}
HtmlWriter 클래스
html 파일을 생성하는 기능을 가진 클래스
타이틀/ 단락 /링크 /이메일 주소 출력, html 태그 닫는 기능
package part15_facade.pagemaker;
import java.io.IOException;
import java.io.Writer;
// HTML 파일을 작성하는 클래스
public class HtmlWriter {
// 간단한 웹페이지를 만드는 클래스
// 메소드 호출 순서가 암묵적으로 지정되어있음
private Writer writer;
public HtmlWriter(Writer writer){
this.writer = writer;
}
// 타이틀 출력
public void title(String title) throws IOException {
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<head>");
writer.write("<title>" + title + "</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("\n");
writer.write("<h1>" + title + "</h1>");
writer.write("\n");
}
// 단락 출력
public void paragraph(String msg) throws IOException {
writer.write("<p>" + msg + "</p>");
writer.write("\n");
}
// 링크 출력
public void link(String href, String caption) throws IOException {
paragraph("<a href=\"" + href + "\">" + caption + "</a>");
}
// 이메일 출력
public void mailto(String mailaddr, String username) throws IOException {
link("mailto:" + mailaddr, username);
}
// Html 닫기
public void close() throws IOException {
writer.write("</body>");
writer.write("</html>");
writer.write("\n");
writer.close();
}
}
참고자료
Java로 배우는 디자인 패턴 입문 3판 _ 영진닷컴