###Facadeパターンとは
処理を行うための「窓口」を用意する。
プログラムは大きくなるにつれ、たくさんのクラスが作られて行く。
それらのクラスを使用するためには、クラス間の関係を理解し、
正しい順番でメソッドを呼び出す必要がある。
Facadeパターンでは、「窓口」を用意し、利用者はその「窓口」に対し要求を出すだけで良い。
###Facade(正面)の役
システムを構成しているその他大勢の役のシンプルな窓口となる。
高レベルでシンプルなインターフェースを外部に提供する。
package facade;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PageMaker {
private PageMaker() {
}
public static void makeWelcomePage(String mailAddress, String fileName) {
try {
Properties mailProp = Database.getProperties("mailData");
String userName = mailProp.getProperty(mailAddress);
HtmlWriter writer = new HtmlWriter(new FileWriter(fileName));
writer.title("Welcome to " + userName + "'s page!");
writer.paragraph(userName + "のページへようこそ。");
writer.paragraph("メール待っていますね。");
writer.mailTo(mailAddress, userName);
writer.close();
System.out.println(fileName + " is created for " + mailAddress + " (" + userName + ")");
} catch (IOException e) {
e.printStackTrace();
}
}
}
###システムを構成しているその他大勢の役
それぞれの仕事を行うが、Facade役のことは意識しない。
Facade役から呼び出されて仕事を行うが、その他大勢の役からFacade役を呼び出すことはない。
package facade;
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;
}
}
package facade;
import java.io.IOException;
import java.io.Writer;
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 mailAddress, String userName) throws IOException {
link("mailTo:" + mailAddress, userName);
}
public void close() throws IOException {
writer.write("</body>");
writer.write("</html>\n");
writer.close();
}
}
###Client(依頼者)の役
Facadeパターンを利用する役
package facade;
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome.html");
}
}
こちらを参考にさせていただきました。
増補改訂版Java言語で学ぶデザインパターン入門