Facade 패턴

Jimin K·2023년 6월 7일
0

디자인 패턴

목록 보기
4/4

JAVA 언어로 배우는 디자인패턴 입문 책의 교재 및 예제 풀이를 정리해보려 한다.

Facade 패턴은 단순한 창구를 만든다.

Facade는 건물의 정면, 즉 현관을 의미한다.

큰 프로그램의 많은 클래스를 적절히 제어해 창구에 요청하는 방식으로 만든다.
복잡히 얽혀서 너저분한 세부 내용을 정리해서 높은 수준의 인터페이스(API)를 제공한다.

인터페이스 수를 줄여 외부와의 결합을 느슨하게 만든다.
이 때문에 패키지(클래스 집합)를 부품으로 가져와 사용할 수 있다.

이 패턴의 역할은 크게 세 개로 나뉘는데 Facade, Client, 그 외 시스템을 구성하는 여러 역 이다.

예제로는 임의 txt파일로 이루어진 데이터베이스 정보를 가져와 HTML 파일을 작성해주는 프로그램이다.

사용하는 클래스는 4가지인데, Database, HtmlWriter, PageMaker, Main 이렇게 구성되어있다.

자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
https://www.youngin.com/reader/pds/pds.asp


문제 1 : PageMaker 클래스만 pagemaker 패키지 밖에서 이용할 수 있게 하고 싶다. Database 와 HtmlWriter 클래스를 pagemaker 패키지 밖에서 이용할 수 없게 하려 한다.

가존에 public class Database, public class HtmlWriter 두 개로 이루어진 클래스의 내용을
class Database, class HtmlWriter 으로 수정한다.

디폴트 값은 같은 패키지에서만 이용할 수 있음을 의미하고 public은 모든 클래스에서 이용할 수 있음을 의미하기 때문이다.

문제 2 : 데이터 파일 maildata.txt 에 포함된 사용자의 이메일 주소 링크 페이지를 만드는 makeLinkPage 메소드를 PageMaker 클래스에 추가한다.

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);
}

문제 3 : 예제 프로그램의 HtmlWriter 클래스에서는 많은 문자열이 있다. 여러줄의 문자열 리터럴을 읽기 쉽게 하는 텍스트 블록이 있다. """ """ 사이에 내용을 작성하면 달라질까?

기존의 내용은 아래와 같다.

        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 내용을 포함할 수 있다.

profile
아둥바둥

0개의 댓글