设计模式:外观(Facade)模式

一、前言

  外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一个新的类,然后在这个类里面将类A和B的处理步骤整合在一起,对于外界我们只暴露新的类中的这个接口,这样代码的复用性就非常的好了,可以将这些代码作为组件去让其他程序去使用,这在我们的开发之中是非常常见的。甚至我们可以将抽象工厂模式中创建产品的接口当做外观模式的一种应用,这也是一种整合。对于模板方法,其实我们也是在父类之中面向抽象编程的,将一些关系整合起来,不过差别还是非常明显的,在外观模式中没有继承关系,是新建一个类来整合其它类之间复杂的相互依赖,调用等关系,因此外观模式比较直观。

二、代码

DataBase 类:
 package zyr.dp.facade;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties; public class DataBase {
private 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;
} }

 HTMLWriter类:

 package zyr.dp.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();
}
}
}

 PageMaker类:

 package zyr.dp.facade;

 import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties; public class PageMaker {
private PageMaker(){
}
public static void makePage(String mailAddr,String filename) throws IOException{
Properties pro=DataBase.getProperties("mailData");
String username=pro.getProperty(mailAddr);
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+"文件成功!");
} }
main类:
 package zyr.dp.facade;

 import java.io.IOException;

 public class Main {

     public static void main(String[] args) {
try {
PageMaker.makePage("2655100328@qq.com", "my_html.html");
} catch (IOException e) {
e.printStackTrace();
}
} }

 mailData存放的位置和内容:(注意如果使用相对地址,对于java程序来说src的上一级就是相对地址的起始地址,如果要放到src里面可以使用“./src/...”)。

  运行结果:

   虽然程序很简单,但是要注意的地方一点也不少,首先就是我们要将外观模式的接口对应的类(pageMaker)以及一些不用生成对象的工具类的构造函数设为私有,不让外部类去创建实例,其次,我们要注意properties读取文件的时候使用相对路径应该从哪个地方开始读写,另外当我们的程序变得复杂的时候,如果将这些类封装成一个模块,如何防止类外的对象访问我们的类呢,可以将除了facade类之外的类的属性设为默认的,这样就能很好的实现高内聚低耦合的设计思想了。这些类本来没关系,但是通过一个整合之后,产生了一定的关联,在实际开发中可能形成递归结构,那就是一个facade模式中使用了很多其他的facade模式,这样不断地实现下去,形成一个facade模式树,因此灵活使用设计模式至关重要。

三、总结

  facade外观模式是一种非常常用的模式,特别是在组织一些复杂的相互调用的逻辑的时候,为外界提供统一的接口(API),可以看到在设计模式中,最常用的应该就是模板方法和facade模式了,很多时候很多需求需要我们认真的取舍,人无远虑必有近忧,同样的,只有为以后的可复用性、可扩展性来考虑,我们的代码才是好的代码。

  程序代码

设计模式:外观(Facade)模式的更多相关文章

  1. 设计模式--外观(Facade)模式

    Insus.NET在去年有写过一篇<软件研发公司,外观设计模式(Facade)>http://www.cnblogs.com/insus/archive/2013/02/27/293606 ...

  2. 一天学习两个设计模式之Facade模式(外观模式,结构型模式)

    程序这东西随着时间推移,程序会越来越大,程序中的类越来越多,而且他们之间相互关联,这会导致程序结构变得越来越复杂.因此我们在使用他们时候,必须要弄清楚他们之间的关系才能使用他们. 特别是在调用大型程序 ...

  3. 设计模式C++描述----14.外观(Facade)模式

    一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统( ...

  4. 设计模式之Facade模式

    Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用.他是为子系统中的一组接口所提供的一个一致的界面. 在遇到以下情况使用Facad ...

  5. 外观(Facade)模式

    外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需 ...

  6. Python笔记:设计模式之facade模式

    facade模式,即门面模式,也称外观模式,这个模式的核心思想是使用facade对象为外部客户端提供一个统一的访问一组子系统的接口,即客户端不会直接与各个子系统交互,而是通过facade对象与各个子系 ...

  7. 十一、外观(Facade)模式--结构模式(Structural Pattern)

    外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...

  8. Head First 设计模式 —— 08. 外观 (Facade) 模式

    思考题 想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262 println.log 日志接口.JDBC 接口 突然让想感觉想不出来,各种 API 都用得挺 ...

  9. 设计模式 外观 Facade

    外观模式的作用是简化接口.它提供一个统一的接口用来访问子系统的一群接口.通过这个高层接口使子系统更容易使用. 同时,通过外观将客户从组件的子系统中解耦. Head 1st中使用了家庭影院的例子来说明外 ...

  10. 设计模式——外观模式(Facade)

    1. 概述     外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. 例子1:一个电源总开关可以控制四盏灯 ...

随机推荐

  1. Respone笔记

    1 设置定时刷新的头 //设置定时刷新的头 response.setHeader("refresh", "5;url=http://www.baidu.com" ...

  2. 理解C#反射

    参考文章:http://blog.csdn.net/educast/article/details/2894892 上面的文章将C#反射要用到的方法都给出了,下面我将写个例子,帮助理解 [1.使用反射 ...

  3. 在ubuntu10.10下安装Google谷歌拼音输入法

    安装步骤如下:1.下载文件:sudo wget http://malu.googlecode.com/files/scim-googlepinyin.tar.gz(经测试,这个链接已经失效了,幸好有前 ...

  4. Java虚拟机知识 总结 记录

    总结了自己这两天掌握的一些JVM相关的知识.方便自己复习. jvm全称是Java Virtual Machine(java虚拟机).它之所以被称之为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象 ...

  5. Java Service Wrapper 发布Java程序或者jar包为Windows服务

    下载Windows版本:http://nchc.dl.sourceforge.net/sourceforge/wrapper/wrapper-windows-x86-32-3.2.3.zip 现在目前 ...

  6. Linux 命令 -- chown

    chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用户或者是用户D,用户组可以是组名或组id.文件名可以使由空格 ...

  7. (转)The remote certificate is invalid according to the validation procedure

    If you get “The remote certificate is invalid according to the validation procedure” exception while ...

  8. sql创建表变量,转百分数

    declare @tab table( ID nt identity(1,1) primary key, --从1开始,每次自增1 ,Name nvarchar(200) ) declare a fl ...

  9. aspose.word 读取word段落内容

    注:转载请标明文章原始出处及作者信息 aspose.word 插件下载 链接: http://pan.baidu.com/s/1qXIgOXY 密码: wsj2 使用原因:无需安装office,无兼容 ...

  10. Linux常用指令整理

    Linux常用命令整理 快捷键 [Tab] [Tab] 接在一串指令的第一个字的后面,则为"命令补全": [Tab] 接在一串指令的第二个字以后时,则为"文件补齐&quo ...