Facadeパターン

###Facadeパターンとは
処理を行うための「窓口」を用意する。
プログラムは大きくなるにつれ、たくさんのクラスが作られて行く。
それらのクラスを使用するためには、クラス間の関係を理解し、
正しい順番でメソッドを呼び出す必要がある。
Facadeパターンでは、「窓口」を用意し、利用者はその「窓口」に対し要求を出すだけで良い。


###Facade(正面)の役
システムを構成しているその他大勢の役のシンプルな窓口となる。
高レベルでシンプルなインターフェースを外部に提供する。

````java
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役を呼び出すことはない。

````java
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;
	}
}
````

````java
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パターンを利用する役

````java
package facade;

public class Main {
	public static void main(String[] args) {
		PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome.html");
	}
}
````

###実行して作成されたHTML
![スクリーンショット 2020-09-18 14.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/105cc65a-9389-9970-5427-63bd51337782.png)

https://github.com/aki0207/facade

こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1454743284&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80">増補改訂版Java言語で学ぶデザインパターン入門</a>