1. 程式人生 > >外觀模式(Facade)

外觀模式(Facade)

edi lena () 聲明 string urn ade rop 要求

Facade?

如果是按照RUP+ 的開發模式,隨著叠代與增量的進行,軟件代碼會越來越龐大,各個模塊之間的關系會越來越復雜,如何你是初次接受該項目的開發非非常棘手,要理解清楚他們之間的關系,才能繼續完成下面的工作。不過與其這麽做,不如為這個大型程序準備一個“窗口”。這樣,我們就不必單獨地關註每個類了,只需簡單地對“窗口”提出請求即可。

  • 關鍵字:** 責任關系,依賴關系 ,調用順序 **

  • 要點概念:提供的窗口可以理解為開辟一個高層的接口

  • 聲明時候使用外觀設計模式:
    當某個程序員得意地說出“啊,在調用那個類之前需要先調用這個類。在調用那個方法之前需要先在這個類中註冊一下”的時候,就意味著我們需要引入Facade角色了。

  • 相關設計模式:

◆Abstract Factory模式(第8章)可以將Abstract Factory 模式看作生成復雜實例時的Facade模式。因為它提供了“要想生成這個實例只需要調用這個方法就OK了”的簡單接口。

◆Singleton模式(第5章)有時會使用Singleton模式創建Facade角色。

◆Mediator模式(第16章)在Facade模式中,Facade角色單方面地使用其他角色來提供高層接口(API)。
而在Mediator模式中,Mediator角色作為Colleague角色間的仲裁者負責調停。可以說,Facade模式是單向的,而Mediator角色是雙向的。

理解職責

  • 目的:實現讀取text文本轉為一個網頁鏈接的程序
    包========>類======>解釋
    pagemaker |Database 從郵件地址中獲取用戶名的類
    pagemaker |HtmlWriter 編寫HTML文件的類
    pagemaker |PageMaker |根據郵件地址編寫該用戶的Web頁面
    |無需package|MainT測試程序行為的類

HtmlWriter :html中隱藏聲明要求必須先調用title()而在PageMaker中我們提前就維護好了調用的順序,後面在MainT不需要關系具體的調用依賴關系。

UML

技術分享圖片

類圖:
技術分享圖片

Code

  • DataBase :
public class DataBase {


    private DataBase(){

    }

    /**
     * 輸入文件名讀取數據
     * @param filname
     * @return
     */
    public static Properties getProperties(String filname){
        String filename=filname+".ini";
        Properties prop = new Properties();

        try {
            prop.load(new FileInputStream(filename));
        }catch (IOException e){
            e.printStackTrace();
        }
        return prop;
    }
}

  • HtmlWriter :

public class HtmlWriter {

    private Writer printWriter;

    public HtmlWriter(Writer writer) {
        this.printWriter = writer;
    }
    // 輸出標題 (這是隱藏條件必須先調用title方法)
    public void title(String title) throws IOException {
        printWriter.write("<html>");
        printWriter.write("<head>");
        printWriter.write("<title>"+title+"</title>");
        printWriter.write("</head>");
        printWriter.write("<body>\n");

        printWriter.write("<h1>"+title+"</h1>");
    }
    // 輸出段落
    public void paragraph(String msg)throws IOException{
        printWriter.write("<p>"+msg+"</p>");
    }
    // 輸出超鏈接
    public void link(String href,String caption) throws IOException{
        printWriter.write("<a href=\""+href+"\">"+caption+"</a>");
    }
    // 輸出郵件地址
    public void mailto(String mailaddr,String username) throws IOException{
        link("mailto:"+mailaddr,username);
    }

    public void close() throws IOException{
        printWriter.write("</body>");
        printWriter.write("</html>\n");
        printWriter.close();
    }
}

  • PageMaker:

public class PageMaker {

    private PageMaker(){

    }

    /**
     * 外觀接口
     * @param mailaddr
     * @param filename
     */
    public static void makeWelcomePage(String mailaddr,String filename){
        try {
            Properties mailporo = DataBase.getProperties("testmail");

            String usernmae = mailporo.getProperty(mailaddr);

            HtmlWriter htmlWriter = new HtmlWriter(new FileWriter(filename));

            htmlWriter.title("歡迎來到"+usernmae+"頁面!");

            htmlWriter.paragraph(usernmae+"歡迎來到"+usernmae+" 的主頁。");

            htmlWriter.paragraph("歡迎給我發送郵件:");

            htmlWriter.link(mailaddr,usernmae);

            htmlWriter.close();

            System.out.println("這是由於"+usernmae+"創建的郵件的主頁界面"+ "From to"+usernmae);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

  • MainT:

public class MainT {


    public static void main(String[] args) {

        PageMaker.makeWelcomePage("[email protected]","welcome.html");

    }
}

外觀模式(Facade)