Facade パターンは構造に関するパターンのひとつです。
システム内部の複数ある呼び出し口に対して
共通に使える1つの呼び出し口を設ける構造。
Facedeパターンにする事で
クライアント(呼び出し元)とサブシステム間の結合度を下げることができる。
クラス図を見てもらうとわかりますが、よくある感じです。
Main・・・・・・・・・・Facedeパターンを利用してサブシステムを使う。
Facade(正面)・・・サブシステムの上に作る窓口
(高レベルのインタフェースを用意すること。)
ClassA~D(その他大勢)・・・サブシステム。単体でも使用可能。
-----------------------------------------------------------------------------------
Facadeにあたるクラス。
ファイル名:PageMaker.java
package pagemaker;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PageMaker {
// コンストラクタ
private PageMaker() { // インスタンスは作らないのでprivate宣言
}
// このメソッドだけでサブシステムを使う一連の処理を完結
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();
}
}
}
-----------------------------------------------------------------------------------
サブシステムにあたるクラス①
ファイル名:Database.java
package pagemaker;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class Database {
/*
コンストラクタ
*/
private Database() { // インスタンスは作らないのでprivate宣言
}
public static Properties getProperties(String dbname) { // データベース名からPropertiesを得る
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.java
package pagemaker;
import java.io.Writer;
import java.io.IOException;
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();
}
}
-----------------------------------------------------------------------------------
メインクラス
ファイル名:PageMaker.java
import pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
// Facadeクラスのメソッド1個呼ぶだけでOK
PageMaker.makeWelcomePage("メールアドレス文字列", "welcome.html");
}
}
0 件のコメント:
コメントを投稿