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