JAVA 언어로 배우는 디자인패턴 입문 책의 교재 및 예제 풀이를 정리해보려 한다.
Facade는 건물의 정면, 즉 현관을 의미한다.
큰 프로그램의 많은 클래스를 적절히 제어해 창구에 요청하는 방식으로 만든다.
복잡히 얽혀서 너저분한 세부 내용을 정리해서 높은 수준의 인터페이스(API)를 제공한다.
인터페이스 수를 줄여 외부와의 결합을 느슨하게 만든다.
이 때문에 패키지(클래스 집합)를 부품으로 가져와 사용할 수 있다.
이 패턴의 역할은 크게 세 개로 나뉘는데 Facade, Client, 그 외 시스템을 구성하는 여러 역 이다.
예제로는 임의 txt파일로 이루어진 데이터베이스 정보를 가져와 HTML 파일을 작성해주는 프로그램이다.
사용하는 클래스는 4가지인데, Database, HtmlWriter, PageMaker, Main 이렇게 구성되어있다.
자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
https://www.youngin.com/reader/pds/pds.asp
가존에 public class Database, public class HtmlWriter 두 개로 이루어진 클래스의 내용을
class Database, class HtmlWriter 으로 수정한다.
디폴트 값은 같은 패키지에서만 이용할 수 있음을 의미하고 public은 모든 클래스에서 이용할 수 있음을 의미하기 때문이다.
Main 클래스의 수정은 아래와 같다.
import pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
PageMaker.makeLinkPage("linkpage.html");
}
}
그리고 makeLinkPage 메소드는 try-catch문으로 구성할 수 있는데, txt 파일의 데이터를 value와 key 값으로 받아들여서 mailto 라는 메소드의 인수로 각각 넣는다.
public static void makeLinkPage(String filename) {
try {
HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
writer.title("Link page");
Properties mailprop = Database.getProperties("maildata");
for (String mailaddr: mailprop.stringPropertyNames()) {
String username = mailprop.getProperty(mailaddr, "(unknown)");
writer.mailto(mailaddr, username);
}
writer.close();
System.out.println(filename + " is created.");
} catch (IOException e) {
e.printStackTrace();
}
}
덧붙이자면, 기존의 makeWelcomPage의 메소드는 아래와 같다.
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.paragraph("Nice to meet you!");
writer.mailto(mailaddr, username);
writer.close();
System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");
} catch (IOException e) {
e.printStackTrace();
}
}
mailto 메소드는 HtmlWriter 내부에 있는 내용으로서 아래와 같다. 수정된 건 없다.
public void mailto(String mailaddr, String username) throws IOException {
link("mailto: " + mailaddr, usernamr);
}
기존의 내용은 아래와 같다.
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");
수정하고자 하는 내용은 아래와 같다.
String title = "Welcome!";
String message = "Hello, world!";
String html = """
<!DOCTYPE html>
<html>
<head>
<title>%s</title>
</head>
<body>
<h1 style="text-align: center">%s</h1>
</body>
</html>
""".formatted(title, message);
System.out.print(html);
}
결과는 달라지지 않는다.
%s 등과 같은 제어문자열을 사용하면 title, message 내용을 포함할 수 있다.