設計模式學習筆記——外觀(Facade)模式
@(設計模式)[設計模式, 外觀模式, facade]
基本介紹
外觀模式其作用可以簡單的理解爲,爲子模塊(底層)抽出一個統一訪問的接口,供父模塊(上層)使用。
使用外觀模式,調用者不需要知道底層的具體實現、邏輯是什麼,只需要使用暴露出的接口就行了。使用外觀模式並沒有強制隱藏掉底層具體實現,也就是說,我們也可以直接調用底層的功能。
外觀案例
類圖
實現代碼
Database類
package com.pc.facade.example;
import java.io.FileInputStream;
import java.util.Properties;
/**
* 數據庫類
* Created by Switch on 2017/3/30.
*/
public final class Database {
private Database() {
}
/**
* 根據數據哭名獲取Properties
*
* @param dbName 數據庫名
* @return Properties對象
*/
public static Properties getProperties(String dbName) {
String fileName = dbName + ".txt";
Properties prop = new Properties();
try {
prop.load(new FileInputStream(fileName));
} catch (Exception e) {
System.out.println("Warning: " + fileName + " is not found.");
}
return prop;
}
}
maildata.txt
switchvov@163.com=Switch
bob@163.com=Bob
HtmlWriter類
package com.pc.facade.example;
import java.io.IOException;
import java.io.Writer;
/**
* Html編寫類
* Created by Switch on 2017/3/30.
*/
public class HtmlWriter {
/**
* 編寫器
*/
private Writer writer;
/**
* 構造方法,設置編寫器
*
* @param writer 編寫器
*/
public HtmlWriter(Writer writer) {
this.writer = writer;
}
/**
* 輸出標題
*
* @param title 標題
* @throws IOException IO異常
*/
public void title(String title) throws IOException {
writer.write("<html>");
writer.write("<head>");
writer.write("<title>" + title + "</title>");
writer.write("<meta charset='UTF-8'/>");
writer.write("</head>");
writer.write("<body>\n");
writer.write("<h1>" + title + "</h1>\n");
}
/**
* 輸出段落
*
* @param msg 信息
* @throws IOException IO異常
*/
public void paragraph(String msg) throws IOException {
writer.write("<p>" + msg + "</p>\n");
}
/**
* 輸出超鏈接
*
* @param href 鏈接
* @param caption 標題
* @throws IOException IO異常
*/
public void link(String href, String caption) throws IOException {
this.paragraph("<a href=\"" + href + "\">" + caption + "</a>");
}
/**
* 輸出郵件地址
*
* @param mailAddress 郵件地址
* @param userName 用戶名
* @throws IOException IO異常
*/
public void mailto(String mailAddress, String userName) throws IOException {
link("mailto:" + mailAddress, userName);
}
/**
* 結束輸出HTML
*
* @throws IOException IO異常
*/
public void close() throws IOException {
writer.write("</body>");
writer.write("</html>\n");
writer.close();
}
}
PageMaker類
package com.pc.facade.example;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
/**
* 頁面Maker類
* Created by Switch on 2017/3/30.
*/
public final class PageMaker {
/**
* 防止外部new出PageMaker的實例,所以聲明爲private方法
*/
private PageMaker() {
}
/**
* 創建歡迎頁
*
* @param mailAddress 郵箱地址
* @param filename 文件名
*/
public static void makeWelcomePage(String mailAddress, String filename) {
try {
Properties mailprop = Database.getProperties(System.getProperty("user.dir") + "/src/main/java/com/pc/facade/example/maildata");
String username = mailprop.getProperty(mailAddress);
HtmlWriter writer = new HtmlWriter(new FileWriter("D://" + 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();
}
}
}
測試類
package com.pc.facade.example.test;
import com.pc.facade.example.PageMaker;
import org.junit.Test;
/**
* PageMaker Tester.
*
* @author Switch
* @version 1.0
*/
public class PageMakerTest {
/**
* 測試外觀模式
*/
@Test
public void testPageMaker() {
PageMaker.makeWelcomePage("[email protected]", "welcome.html");
}
}
運行結果
控制檯輸出
welcome.html is created for switchvov@163.com (Switch)
D盤下welcome.html的內容
<html><head><title>Welcome to Switch's page!</title><meta charset='UTF-8'/></head><body>
<h1>Welcome to Switch's page!</h1>
<p>歡迎來到Switch的主頁。</p>
<p>等着你的郵件哦!</p>
<p><a href="mailto:[email protected]">Switch</a></p>
</body></html>
瀏覽器中運行結果
外觀模式中的角色
Facade(窗口)
Facade
角色是代表構成系統的許多其他角色的“簡單窗口” 。Facade
角色向系統外部提供高層接口(API
)。在案例中,由PageMaker
類扮演此角色。
構成系統的許多其他角色
這些角色各自完成自己的工作,它們並不知道Facade
角色。Facade
角色調用其他角色進行工作,但是其他角色不會調用Facade
角色。在案例中,由Database
類和HtmlWriter
類扮演此角色。
Client(請求者)
Client
角色負責調用Facade
角色(在GoF
書(請參見附錄E[GoF])中,Client
角色並不包含在Facade
模式中)。在案例中,由Main
類扮演此角色。
類圖
GitHub:DesignPatternStudy
——————參考《圖解設計模式》