Design Pattern | Facade Pattern (퍼사드 패턴)

Facade 패턴이란?

  • Facade라는 영어 단어는 정면이라는 의미이다.
  • “건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다른 코드 부분에 대하여 간략화된 인터페이스를 제공해 주는 디자인 패턴을 의미한다.
  • 큰 프로그램을 사용해 처리를 실시하려면, 관련되어 있는 많은 클래스를 적절히 제어해야 한다. 그 처리를 실시하기 위한 창구를 만들어 두면, 많은 클래스를 개별적으로 제어하지 않아도 된다.
  • Facade 패턴은 복잡한 시스템에 대한 간단한 창구를 준비하는 방식이다.
  • Facade 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨를 사용할 수 있게 간단한 인터페이스를 제공해 준다.
  • GoF의 디자인 패턴에서는 구조와 관련된 디자인 패턴으로 분류된다.

Facade 패턴 예제 프로그램

사용자의 웹 페이지를 만드는 예제 프로그램이다.

Class Diagram
Facade Pattern Class Diagram

1. PageMaker 클래스

이메일 주소에서 사용자의 웹 페이지를 만드는 클래스이다. 이 클래스는 Facade가 된다.

PageMaker.java

package com.devkuma.designpattern.structural.facade.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("Welcome to " + username + "'s page!");
            writer.paragraph(username + "의 페이지에 어서오세요.");
            writer.paragraph("문의 사항을 메일을 보내주세요.");
            writer.mailto(mailaddr, username);
            writer.close();
            System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. HtmlWriter 클래스

HTML 파일을 작성하는 클래스입니다.

HtmlWriter.java

package com.devkuma.designpattern.structural.facade.pagemaker;

import java.io.IOException;
import java.io.Writer;

public class HtmlWriter {

    private Writer writer;

    public HtmlWriter(Writer writer) {
        this.writer = writer;
    }

    public void title(String title) throws IOException {
        writer.write("<html>");
        writer.write("<head>");
        writer.write("<title>" + title + "</title>");
        writer.write("</head>");
        writer.write("<body>\n");
        writer.write("<h1>" + title + "</h1>\n");
    }

    public void paragraph(String msg) throws IOException {
        writer.write("<p>" + msg + "</p>\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);
    }

    public void close() throws IOException {
        writer.write("</body>");
        writer.write("</html>\n");
        writer.close();
    }
}

3. Database 클래스

이메일 주소에서 사용자 이름을 얻는 클래스이다.

Database.java

package com.devkuma.designpattern.structural.facade.pagemaker;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Database {

    private Database() {
    }

    public static Properties getProperties(String dbname) {
        ClassLoader loader = Database.class.getClassLoader();
        String file = loader.getResource("facade/pagemaker/" + dbname + ".txt").getFile();
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(file));
        } catch (IOException e) {
            System.out.println("Warning: " + file + " is not found.");
        }
        return prop;
    }
}

4. maildata 데이터베이스

데이터베이스 파일이다.

maildata.txt

devkuma@devkuma.com=dekuma
ariakuma@devkuma.com=ariakuma
kimkc@devkuma.com=kim

5. Main 클래스

메인 처리를 실행하는 클래스이다.

Main.java

package com.devkuma.designpattern.structural.facade;

import com.devkuma.designpattern.structural.facade.pagemaker.PageMaker;

public class Main {
    public static void main(String[] args) {
        PageMaker.makeWelcomePage("devkuma@devkuma.com", "welcome.html");
    }
}

6. 실행 결과

<html><head><title>Welcome to devkuma's page!</title></head><body>
<h1>Welcome to devkuma's page!</h1>
<p>devkuma의 페이지에 어서오세요.</p>
<p>문의 사항을 메일을 보내주세요.</p>
<p><a href="mailto:devkuma@devkuma.com">devkuma</a></p>
</body></html>

Facade 패턴의 장점

클래스나 메소드가 많이 있으면, 프로그래머는 어느 것을 사용해야 할지 헤매거나, 호출 순서에 주의해야 한다. 주의해야 한다는 것은 그만큼 실수하기 쉽다는 것이다.
Facade 패턴을 사용하면 인터페이스를 줄이고 복잡한 것을 단순히 보여줄 수 있다.
인터페이스의 수가 적다는 것은 외부와의 결합이 희소하다는 표현도 할 수 있다. 즉, 완만한 결합이 되어, 패키지를 부품으로서 재이용하기 쉽게 해준다.