1、前言html
外觀模式是一種很是簡單的模式,簡單到咱們常常都會使用,好比對於類A和B,若是二者須要交互,通過必定的處理過程才能實現某一個具體的功能,那麼咱們能夠將這個處理的過程定義爲一個新的類,而後在這個類裏面將類A和B的處理步驟整合在一塊兒,對於外界咱們只暴露新的類中的這個接口,這樣代碼的複用性就很是的好了,能夠將這些代碼做爲組件去讓其餘程序去使用,這在咱們的開發中是很是常見的。甚至咱們能夠將抽象工廠模式中建立產品的接口當作外觀模式的一種應用,這也是一種整合。對於模板方法,其實咱們也是在父類中面向抽象編程的,將一些關係整合起來,不過差異仍是很是明顯的,在外觀模式中沒有繼承關係,是新建一個類來整合其它類之間複雜的相互依賴、調用等關係,所以外觀模式比較直觀。java
2、代碼編程
package designMode.facade; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class DataBase { public static Properties getProperties(String dbName){ Properties pro = new Properties(); try { pro.load(new FileInputStream(dbName + ".txt")); }catch (FileNotFoundException e){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return pro; } }
package designMode.facade; import java.io.IOException; import java.io.Writer; public class HTMLWriter { private Writer writer; public HTMLWriter(Writer writer) { this.writer = writer; } public void title(String theTitle){ try { writer.write("<html><head><title>"+theTitle+"</title></head><body>\n"); writer.write("<h1>"+theTitle+"</h1>\n"); } catch (IOException e) { e.printStackTrace(); } } public void paragraph(String msg){ try { writer.write("<p>"+msg+"</p>\n"); } catch (IOException e) { e.printStackTrace(); } } public void link(String href,String caption){ paragraph("<a href=\""+href+"\" >"+caption+"</a>"); } public void mailTo(String mailAddr,String username) { link("mailto:"+mailAddr,username); } public void close() { try { writer.write("</body></html>\n"); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
package designMode.facade; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; public class PageMaker { public static void makePage(String mailAddr,String filename){ Properties pro = DataBase.getProperties("mailData"); String username = pro.getProperty("mailAddr"); try { HTMLWriter html = new HTMLWriter(new FileWriter(filename)); html.title("江疏影真好看!"); html.paragraph("歡迎 " + username + " 來到英雄聯盟!"); html.paragraph("是時候展示真正的技術了!"); html.mailTo(mailAddr,username); html.close(); System.out.println("爲"+username+"建立"+filename+"文件成功!"); } catch (IOException e) { e.printStackTrace(); } } }
package designMode.facade; public class Main { public static void main(String[] args) { PageMaker.makePage("237416032@qq.com","my_html.html"); } }
mailData存放的位置和內容:(注意若是使用相對地址,對於java程序來講src的上一級就是相對地址的起始地址,若是要放到src裏面可使用「./src/...」)。設計模式
雖然程序很簡單,可是要注意的地方一點也很多,首先就是咱們要將外觀模式的接口對應的類(pageMaker)以及一些不用生成對象的工具類的構造函數設爲私有,不讓外部類去建立實例,其次,咱們要注意properties讀取文件的時候使用相對路徑應該從哪一個地方開始編寫,另外當咱們的程序變得複雜的時候,若是將這些類封裝成一個模塊,如何防止類外的對象訪問咱們的類呢,能夠將除了facade類以外的類的屬性設爲默認的,這樣就能很好地實現高內聚低耦合的設計思想了。這些類原本不要緊,可是經過一個整合整合,產生了必定的關聯,在實際開發中可能造成遞歸結構,那就是一個facade模式中使用了不少其餘的facade模式,這樣不斷的實現下去,造成了一個facade模式樹,所以靈活使用設計模式相當重要。函數
3、總結工具
facade外觀模式是一種很是常見的模式,特別是在組織一些複雜的相互調用的邏輯的時候,爲外界提供統計的接口(API),能夠看到在設計模式中,最多見的應該就是模板模式和外觀模式,不少時候不少需求須要咱們認真的取捨,人無遠慮必有近憂,一樣的,只有爲之後的可複用性、可擴展性來考慮,咱們的代碼纔是好的代碼。this