今日の目標
JavaのFacadeパターンとはどういったものなのかを知る
使うもの
ではスタート
はじめに
まずはFacadeパターンとはどのようなものなのかをWikipediaさんで調べてみる。
Facade パターンあるいは Façade パターン(ファサード・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義された、コンピュータソフトウェアのデザインパターンの1つである。Facade(ファサード)とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的とする。(wikipedia-Facadeパターン)
えーと、存在するシステムを独立させたまま、アクセスは「かーんたーん」にする、ということか?
ちなみに参考にしている本には、システムの外側にはシンプルなインタフェースを提供する、ということが書いてありました。
本のサンプルを試してみる
今回のサンプルはWebサイトの1ページが、メールアドレス
と作成するサイト名
をPageMakerクラスのメソッドに渡せば作れる!というものです。中では、下記のことが行われています。
- 渡されたメールアドレスに紐づいている名前をテキストから取得する(担当:Databaseクラス)
- メールアドレスと名前を使って、HTMLの中身を作成する(担当:HtmlWriterクラス)
- Databaseクラスを使って名前を取得したり、HtmlWriterクラスに「こういう形で作れ!」と命令するやつ(担当者:PageMakerクラス)
まずはDatabaseクラス。特にDBに接続しているのではなく、プロジェクト直下のテキストにアクセスし、そこに書かれているものを取得しているだけです。
package pagemaker;
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;
}
}
次にHtmlWriterクラス。HTMLを新規ファイルに記述します。
package pagemaker;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class HtmlWriter {
private StringBuffer sb = new StringBuffer();
private String filename;
// コンストラクタ
public HtmlWriter(String filename) {
this.filename = filename;
}
// タイトルを表示する
public void title(String title) throws IOException {
sb.append("<html>");
sb.append("<head>");
sb.append("<title>" + title + "</title>");
sb.append("</head>");
sb.append("<body>\n");
sb.append("<h1>" + title + "</h1>\n");
}
// 段落を表示する
public void paragraph(String msg) throws IOException {
sb.append("<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 Exception {
sb.append("</body>");
sb.append("</html>\n");
try (PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(filename)), "UTF-8")))) {
pw.println(sb.toString());
} catch(Exception e) {
throw e;
}
}
}
次にPageMaker。命令屋さん。こいつが窓口を担当してます。
package pagemaker;
import java.util.Properties;
public class PageMaker {
private PageMaker() {}
public static void makeWelcomePage(String mailaddr, String filename) {
try {
Properties prop = Database.getProperties("maildata");
String username = prop.getProperty(mailaddr);
HtmlWriter writer = new HtmlWriter(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(Exception e) {
e.printStackTrace();
}
}
}
最後にMain。記述しているのは一文のみ!これだけ呼び出せば、簡単なwelcomeページが作れちゃいます。
package pagemaker;
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("bbb@bbb.com", "Bwelcome.html");
}
}
中で使っているmaildata.txtはこんな感じになってます。
aaa@aaa.com=AAA ARIGA
bbb@bbb.com=BBB BILL
ccc@ccc.com=CCC CUBE
Main実行して出力されたページを表示すると、こんな感じ。きちんとHTMLが作られていますね。
インタフェースが簡潔だと、アクセスするのも楽ですし、ユーザはヘタに作りこまなくて良いのでバグを埋め込まれることも少ない、という利点があるのかな?とか思いました。使う側が楽なのはとてもありがたいですよね。