外觀模式(Facade)
阿新 • • 發佈:2018-10-23
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)