設計模式學習筆記——外觀(Facade)模式

設計模式學習筆記——外觀(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

——————參考《圖解設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章