LoginSignup
0
0

More than 3 years have passed since last update.

Facadeパターン

Posted at

Facadeパターンとは

処理を行うための「窓口」を用意する。
プログラムは大きくなるにつれ、たくさんのクラスが作られて行く。
それらのクラスを使用するためには、クラス間の関係を理解し、
正しい順番でメソッドを呼び出す必要がある。
Facadeパターンでは、「窓口」を用意し、利用者はその「窓口」に対し要求を出すだけで良い。

Facade(正面)の役

システムを構成しているその他大勢の役のシンプルな窓口となる。
高レベルでシンプルなインターフェースを外部に提供する。

package facade;

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

public class PageMaker {
    private PageMaker() {
    }

    public static void makeWelcomePage(String mailAddress, String fileName) {
        try {
            Properties mailProp = Database.getProperties("mailData");
            String userName = mailProp.getProperty(mailAddress);
            HtmlWriter writer = new HtmlWriter(new FileWriter(fileName));
            writer.title("Welcome to " + userName + "'s page!");
            writer.paragraph(userName + "のページへようこそ。");
            writer.paragraph("メール待っていますね。");
            writer.mailTo(mailAddress, userName);
            writer.close();
            System.out.println(fileName + " is created for " + mailAddress + " (" + userName + ")");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

システムを構成しているその他大勢の役

それぞれの仕事を行うが、Facade役のことは意識しない。
Facade役から呼び出されて仕事を行うが、その他大勢の役からFacade役を呼び出すことはない。

package facade;

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

public class Database {
    private Database() {
    }

    public static Properties getProperties(String dbName) {
        String fileName = dbName + ".txt";
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(fileName));
        } catch (IOException e) {
            System.out.println("Warning:" + fileName + " is not found");
        }
        return prop;
    }
}
package facade;

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 mailAddress, String userName) throws IOException {
        link("mailTo:" + mailAddress, userName);
    }

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

Client(依頼者)の役

Facadeパターンを利用する役

package facade;

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

実行して作成されたHTML

スクリーンショット 2020-09-18 14.59.53.png

こちらを参考にさせていただきました。
増補改訂版Java言語で学ぶデザインパターン入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0