新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:デザインパターン

[学習記録] デザインパターン

内容 第15章:Facadeパターン

少し飛ばして15章から。

概要
  • 処理を行うための窓口を作る
    • 大きなプログラムは相互に関係しあい、複雑になっていく
    • たくさんのクラスを個別に制御しなくても、窓口に対して要求を出すだけでよいようにする
    • facadeは「建物の正面」という意味
    • 複雑な詳細をまとめ、高レベルのインタフェースを提供する
サンプルプログラム
DAO メールアドレスからユーザ名を取得する
TexWriter Tex文書を作成する
TexMaker メールアドレスからTex文書のテンプレを作る
Main 動作確認用
  • DAO
    • データベースからメールアドレスをキーとしてユーザ名を取得する
    • …という風に見せたい感じのやっつけクラス
import java.util.HashMap;
import java.util.Map;

public class DAO {
	private static Map<String, String> db;
	
	static {
		db = new HashMap<String, String>();
		db.put("hoge@hoge.jp", "Hoge Taro");
		db.put("huga@aaa.com", "Huga Jiro");
	}
	
	private DAO() {
	}
	public static String getName(String address) {
		return db.get(address);
	}
}
  • TexWriter
    • Tex文書を作るためのもろもろAPI。実用性皆無だけど…
import java.io.IOException;
import java.io.Writer;

public class TexWriter {
	private Writer writer;
	public TexWriter(Writer writer) {
		this.writer = writer;
	}
	public void header(String title, String author, String email) throws IOException {
		writer.write("\\documentclass{amsart}");
		writer.write("\\title{" + title + "}");
		writer.write("\\author{" + author + "}");
		writer.write("\\email{" + email + "}");
		writer.write("\\date{\\today}");
		writer.write("\\begin{document}");
		writer.write("\\maketitle");
	}
	public void paragraph(String secTitle, String msg) throws IOException {
		writer.write("\\section{" + secTitle + "}");
		writer.write(msg);
	}
	public void close() throws IOException{
		writer.write("\\end{document}");
		writer.close();
	}
	
}
  • TexMaker
    • facade役。Databaseからユーザ名を持ってきて、TexWriterでTex文書を作る。
import java.io.FileWriter;
import java.io.IOException;

public class TexMaker {
	private TexMaker() {
	}
	public static void makeHelloWorldTex(String address, String fileName) {
		try {
			String userName = DAO.getName(address);
			TexWriter writer = new TexWriter(new FileWriter(fileName));
			writer.header("Hello World", userName, address);
			writer.paragraph("Test", "hogehoge...");
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
  • Main
    • 動作確認用。
public class Main {

	public static void main(String[] args) {
		TexMaker.makeHelloWorldTex("hoge@hoge.jp", "test.tex");
	}

}

f:id:uriku:20150126220157j:plain

補足
  • Facade役がやることとは
    • インタフェース(API)を少なくすること
    • クラスやメソッドがたくさんあるとどれを使えばいいか迷うし、順番にも注意する必要
    • Facade役をまとめた新たなFacade役を作るといったように、再帰的に適用することも可能
    • 複雑なプログラムの内部を熟知していると逆にFacadeを作りたがらないが、複雑な手順は頭の中に隠すのではなくコードとして表現しておくべき