본문 바로가기

Language/Java

Part 15. Facade

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