2012年11月27日火曜日

Facade パターン(ファサード・パターン)

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 件のコメント:

コメントを投稿









ロリポップ!なら月々105円から

WordPress、MovableTypeなどの簡単インストール、

アクセス解析、ウェブメーラーが標準装備!






プロペシア