设计模式:Facade模式
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模式相关推荐
- 重学设计模式 - Facade模式
1. Facade模式简介 Façade在建筑领域的意思是:(掩饰真相的)门面,也就意味着,如果你想探究更细节的真相就需要经过Façade. <设计模式>一书中对Façade模式的 ...
- C++设计模式-Facade模式
Facade模式 作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一 ...
- GOF 设计模式Facade模式 笔记
Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构图 在以下情况使用: 当你要为一个复杂子系统提供一个简 ...
- 设计模式-Facade模式
门面(Facade)模式的理解与应用 概念 门面模式,指子系统的外部与其内部的通信必需通过一个统一的门面(Facade)对象进行,示意图如下: 应用场景 为一个复杂子系统提供一个简单接口 子系统常常因 ...
- 设计模式--门面(Facade)模式
模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...
- facade java_Java设计模式之Facade模式
Java设计模式之Facade模式 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- Java设计模式 -11- 外观模式(Facade模式)
Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...
- PHP设计模式 - 门面模式(Facade)通俗易懂 / 友好示例代码
前言 门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面.门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户 ...
- C++设计模式——门面模式(facade pattern)
一.原理讲解 门面模式也叫做外观模式,实质就是一个封装接口,通常是将一类功能或者一个层次功能用一个函数封装起来,供客户端统一调用. 1.1意图 为子系统中的一组接口提供一个一致的界面,Facade模式 ...
最新文章
- yum挂载ftp上无法安装问题
- java dart 官司_Dart和Java的区别
- php mysql-mysqli
- 读spring源码(一)-ClassPathXmlApplicationContext-初始化
- 在Js或者cess后加版本号 防止浏览器缓存
- FOI冬令营 Day2
- 计算机组成原理期末复习【超实用】
- react-jwchat,一个简单的web聊天组件
- 小程序轮播图测试用例
- 如何把wav转换为mp3?
- 重复组合公式及其证明方法
- 百度关键词指数查询易语言代码
- linux下使用C语言实现MQTT通信(三丶总结经验)
- js:使用nodejs为页面传递mysql中的数据
- 中国石油大学《化工原理二》
- 基于MATLAB的远程声控小车的系统设计与仿真
- 计算机科学与技术考研辅导班,[独峰考研]清华大学计算机科学与技术考研辅导班-清华计算机系考研经验真题...
- Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
- 2021-07-10 arduino 用于矩阵键盘的 开源库函数 keypad.h使用说明
- Vue.js 组件化开发