Facade模式——简单窗口

当调用大型程序进行处理时,我们需要格外注意那些数量庞大的类之间错综复杂的关系。不过有一种更简单的做法,就是为这个大型程序提供一个“窗口”。这样,我们就不必单独地关注每个类了,只需简单地对“窗口”提出请求即可。

这个“窗口”就是Facade模式。使用Facade模式可以为相互关联在一起的错综复杂的类整理出高层接口(API)。其中的Facade角色可以让系统对外只有一个简单的接口(API)。而且,Facade角色还会考虑到系统内部各个类之间的责任关系和依赖关系,按照正确的顺序调用各个类。

下面的示例程序将要编写简单的Web页面。

  • 类的一览表
名字 说明
pagemaker Database 从邮件地址中获取用户名的类
pagemaker HtmlWriter 编写HTML文件的类
pagemaker PageMaker 根据邮件地址编写该用户的Web页面
default Main 测试程序行为的类
  • Database类
package pagemaker;import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;public class Database {private Database() {}public static Properties getProperties(String dbname) {String filename = dbname + ".txt";Properties prop = new Properties();try {prop.load(new FileInputStream(filename));}  catch (IOException e) {System.out.println("Warning: " + filename + " is not found.");}return prop;}
}
  • HtmlWriter类
package pagemaker;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 title) throws IOException {writer.write("<html>");writer.write("<head>");writer.write("<title>" + title + "</title>");writer.write("</head>");writer.write("<body>\n");writer.write("<h1>" + title + "</h1>\n");}public void paragraph(String msg) throws IOException {writer.write("<p>" + msg + "</p>\n");}public void link(String href,String caption) throws IOException {paragraph("<a href=\"" + href + "\">" + caption + "</a>");}public void mailto(String mailaddr,String username) throws IOException {link("mailto:" + mailaddr, username);}public void close() throws IOException {writer.write("</body>");writer.write("</html>\n");writer.close();}
}
  • PageMaker类
package pagemaker;import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class PageMaker {private PageMaker() {}public static void makeWelcomePage(String mailaddr, String filename) {try {Properties mailprop = Database.getProperties("D:\\i编程" +"\\IntelliJ IDEA Community Edition 2017.3.4\\workspace" +"\\Program\\src\\DesignPatterns\\FacadePattern\\maildata");String username = mailprop.getProperty(mailaddr);HtmlWriter writer = new HtmlWriter(new FileWriter(filename));writer.title("Welcome to " + username + "'s page!");writer.paragraph("欢迎来到" + username + "的主页");writer.paragraph("期待你的邮件!");writer.mailto(mailaddr, username);writer.close();System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");} catch (IOException e) {e.printStackTrace();}}
}
  • Main类
import pagemaker.PageMaker;public class Main {public static void main(String[] args) {PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome.html");}
}
  • maildata.txt
hyuki@hyuki.com=Hiroshi Yuki
hanako@hyuki.com=Hanako Sato
tomura@hyuki.com=Tomura
mamoru@hyuki.com=Mamoru Takahashi

示例输出如下:

<html><head><title>Welcome to Hiroshi Yuki's page!</title></head><body>
<h1>Welcome to Hiroshi Yuki's page!</h1>
<p>欢迎来到Hiroshi Yuki的主页</p>
<p>期待你的邮件!</p>
<p><a href="mailto:hyuki@hyuki.com">Hiroshi Yuki</a></p>
</body></html>

##Facade模式中的角色

  • Facade(窗口)

Facade角色是代表构成系统的许多其他角色的“简单窗口”。Facade角色向系统外部提供高层接口(API)。在示例程序中,由PageMaker类扮演此角色。

  • 构成系统的许多其他角色

这些角色各自完成自己的工作,它们并不知道Facade角色。Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色。在示例程序中,由Database类和HtmlWriter类扮演此角色。

  • Client(请求者)

Client角色负责调用Facade角色。在示例程序中,由Main类扮演此角色。


##Facade模式的思路

Facade模式可以让复杂的东西看起来简单,隐藏了后台工作的这些类之间的关系和它们的使用方法,重点是接口变少了,调用一个接口可以实现很多方法和类的递归调用,使功能的实现更加简单。


想了解更多关于设计模式:设计模式专栏
设计模式总结

设计模式:Facade模式相关推荐

  1. 重学设计模式 - Facade模式

    1.     Facade模式简介 Façade在建筑领域的意思是:(掩饰真相的)门面,也就意味着,如果你想探究更细节的真相就需要经过Façade. <设计模式>一书中对Façade模式的 ...

  2. C++设计模式-Facade模式

    Facade模式 作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一 ...

  3. GOF 设计模式Facade模式 笔记

    Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构图 在以下情况使用: 当你要为一个复杂子系统提供一个简 ...

  4. 设计模式-Facade模式

    门面(Facade)模式的理解与应用 概念 门面模式,指子系统的外部与其内部的通信必需通过一个统一的门面(Facade)对象进行,示意图如下: 应用场景 为一个复杂子系统提供一个简单接口 子系统常常因 ...

  5. 设计模式--门面(Facade)模式

    模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...

  6. facade java_Java设计模式之Facade模式

    Java设计模式之Facade模式  GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...

  7. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  8. Java设计模式 -11- 外观模式(Facade模式)

    Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...

  9. PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码

    前言 门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面.门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户 ...

  10. C++设计模式——门面模式(facade pattern)

    一.原理讲解 门面模式也叫做外观模式,实质就是一个封装接口,通常是将一类功能或者一个层次功能用一个函数封装起来,供客户端统一调用. 1.1意图 为子系统中的一组接口提供一个一致的界面,Facade模式 ...

最新文章

  1. yum挂载ftp上无法安装问题
  2. java dart 官司_Dart和Java的区别
  3. php mysql-mysqli
  4. 读spring源码(一)-ClassPathXmlApplicationContext-初始化
  5. 在Js或者cess后加版本号 防止浏览器缓存
  6. FOI冬令营 Day2
  7. 计算机组成原理期末复习【超实用】
  8. react-jwchat,一个简单的web聊天组件
  9. 小程序轮播图测试用例
  10. 如何把wav转换为mp3?
  11. 重复组合公式及其证明方法
  12. 百度关键词指数查询易语言代码
  13. linux下使用C语言实现MQTT通信(三丶总结经验)
  14. js:使用nodejs为页面传递mysql中的数据
  15. 中国石油大学《化工原理二》
  16. 基于MATLAB的远程声控小车的系统设计与仿真
  17. 计算机科学与技术考研辅导班,[独峰考研]清华大学计算机科学与技术考研辅导班-清华计算机系考研经验真题...
  18. Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
  19. 2021-07-10 arduino 用于矩阵键盘的 开源库函数 keypad.h使用说明
  20. Vue.js 组件化开发

热门文章

  1. 工作方法 - 戒定慧
  2. buildroot技巧
  3. python正则表达式匹配字符串相关方法
  4. 用计算机怎么编程画出流量水位曲线,水位流量关系曲线的绘制方法
  5. 国内Scrum工具,敏捷工具推荐
  6. 【题解】[ZJOI2007]棋盘制作
  7. 两条不重复的最大路径
  8. springboot配置数据库连接池hikari
  9. Windows10系统重装(U盘重装系统,以及自己踩过的坑)
  10. Python学习之路【第一篇】-Python简介和基础入门