Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Facadeパターンを触ってみる

Posted at

今日の目標

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に接続しているのではなく、プロジェクト直下のテキストにアクセスし、そこに書かれているものを取得しているだけです。

Database.java
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を新規ファイルに記述します。

HtmlWriter.java
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。命令屋さん。こいつが窓口を担当してます。

PageMaker.java
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ページが作れちゃいます。

Main.java
package pagemaker;

public class Main {

	public static void main(String[] args) {
		PageMaker.makeWelcomePage("bbb@bbb.com", "Bwelcome.html");
	}

}

中で使っているmaildata.txtはこんな感じになってます。

maildata.txt
aaa@aaa.com=AAA ARIGA
bbb@bbb.com=BBB BILL
ccc@ccc.com=CCC CUBE

Main実行して出力されたページを表示すると、こんな感じ。きちんとHTMLが作られていますね。
facade1.png

facade2.png

インタフェースが簡潔だと、アクセスするのも楽ですし、ユーザはヘタに作りこまなくて良いのでバグを埋め込まれることも少ない、という利点があるのかな?とか思いました。使う側が楽なのはとてもありがたいですよね。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?