15. Facade 패턴
- ‘창구’ 역할을 담당하는 클래스
- 복잡한 내부는 숨기고, 높은 레벨의 인터페이스(API)를 외부에 제공한다.
- 복잡한 시스템을 간단하게 보여준다
● 클래스 다이어그램

※ Database 클래스
- 데이터베이스 명을 지정하면, 그 이름에 해당하는 프로퍼티 파일을 열어서 Properties를 만드는 클래스
- 서브시스템을 구성
package hw.ch15.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 = dbname + ".txt";
Properties prop = new Properties();
prop.load(new FileReader(filename));
return prop;
}
}
※ HtmlWriter 클래스
- 간단한 웹페이지를 작성하는 클래스
- 서브시스템을 구성
package hw.ch15.pagemaker;
import java.io.Writer;
import java.io.IOException;
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();
}
}
※ PageMaker 클래스 (Facade의 역할)
- Database 클래스와 HtmlWriter 클래스를 조합하여, 지정된 사용자의 웹 페이지를 작성하기 위한 클래스
- 높은 레벨에서 간단한 인터페이스를 시스템 외부에 제공한다.
- 시스템을 구성하는 많은 역할의 ‘간단한 창구’가 되는 역할을 한다.
package hw.ch15.pagemaker;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
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(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();
}
}
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();
}
}
public static void makeURLPage(String filename) {
try {
HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
writer.title("Url page");
Properties urlprop = Database.getProperties("urldata");
for (String urlname: urlprop.stringPropertyNames()) {
String urladdr = urlprop.getProperty(urlname, "(unknown)");
writer.link(urladdr, urlname);
}
writer.close();
System.out.println(filename + " is created.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
※ Main 클래스 (Client의 역할 )
- Main 클래스는, Database나 HtmlWriter 클래스를 직접 이용하지 않고, high-level API를 제공하는 PageMaker의 메소드만을 사용하여 원하는 작업을 한다.
package hw.ch15;
import hw.ch15.pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
//PageMaker.makeLinkPage("linkPage.html");
//PageMaker.makeWelcomePage("hyuki@example.com", "welcome.html");
PageMaker.makeURLPage("urlPage.html");
}
}
▶ 텍스트 블록을 사용하기
package ch15.A3;
public class Main {
public static void main(String[] args) {
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);
String myString = "my name is %s".formatted("jje");
System.out.println(myString);
}
}
'Language > Java' 카테고리의 다른 글
Part 18. Memento (0) | 2023.06.06 |
---|---|
Part 7. Build (0) | 2023.06.06 |
Part 14. Chain of Responsibility (0) | 2023.06.05 |
Part 22. Command (0) | 2023.06.04 |
Part 20. Flyweight (0) | 2023.06.04 |