はじめに1. Facadeパターン
プログラム開発の手順、時間の経過とともに、より多くのクラス、より複雑になる関係を呼び出すだけでなく、リコールオーダーに関連する問題。この時点で、我々はユーザーのために仕上げ、「ウィンドウ」、複雑な関係と呼び出しシーケンスが書かれているが必要です。このモデルの重要な考え方は次のとおりです。難易度を下げます。したがって、開発効率を向上プログラムの信頼性と保守性を向上させます。
2.サンプルプログラム
ように挨拶して、利用者情報のデータベース内から最初に読んで、その後、頭部、胴体のページのシーケンスを生成します。以下は、Webページを生成する方法の手順を説明します。「複合体」は十分ではないが、だけでなく、2つのクラスを必要とするには、呼び出しシーケンスを持っています。私たちは、すべてのコールを完了するために、コードの行を、このモードを使用するウィンドウを作成します。
図クラス2.1
2.2プログラム
図クラスに示すように、Databaseクラスは、ユーザー情報が読み取られたデータベース(この場合はテキストTXT)、HtmlWriterから責任がある、それは1つのAPIが含まれている、彼らは、Webページを生成するために呼び出す必要があります。PageMakerのウィンドウで、仕事を完了するためにコードの最終的に一つだけの行で最も複雑な関係とメイン、メインパッケージのユーザーへの順次呼び出しになります。
public class Database {
private Database() { // 防止外部new出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;
}
}
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 { // 结束输出HTML
writer.write("</body>");
writer.write("</html>\n");
writer.close();
}
}
public class PageMaker {
private PageMaker() {
}
public static void makeWelcomePage(String mailaddr, String filename) {
try {
//先从数据库中提取出来邮箱信息
Properties mailprop = Database.getProperties("D:\\XXXXXX\\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();
}
}
}
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("[email protected]","test.html");
}
}
//“数据库”
[email protected]=username
3.役割とクラス図
- ファサード(ウィンドウ):ダウンコール複合クラスおよびインタフェースは、上方にシンプルなAPIを提供します。この役割は、PageMakerので再生されます。
- その他の役割は、システムを構成する:それぞれが自分の仕事の役割を完了し、彼らは窓の存在を知らないが、窓の役割はそれらを呼び出します。そして、本実施例のようにHtmlWriter Databaseクラス。
- クライアント(リクエスタ):ファサードの役割を呼び出すための責任、主がこの役割を果たし、この場合には。
4.概念と展開
- 利点ファサードの役割
キーがすることです複雑さを軽減た開発は、低効率、高誤り確率になります- 。プログラマが、ビジネスロジックを気にする必要があるが、また、複雑な基盤となるAPIのさまざまな懸念が組み合わせを呼び出す場合、有名なことわざ、呂が言ってはいけません:コンピュータの世界では、存在する場合、問題が解決しない中間層を追加することなく、その後は再帰的に追加しました。ファサードは、中間層です。中間層は別の利点を有する:カップリングを減少させます。
- 再帰的にFacadeパターン
即上文所说,递归的加中间层。