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

特别是在调用大型程序进行处理时候,我们需要弄清楚错综复杂的关系。不过与其这么做不如为这个大程序准备一个"窗口"。这样,我们就不必为关注每一个类了,只需要对窗口提出请求即可!

这个窗口就是我们要学习的Facade模式,(也叫:外观模式)。Facade是一个源自于法语的单词,它的意思是:“建筑物的表面”

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

源码结构以及职责:

DataBase 从邮件地址中获取用户名的类

HtmlWriter 编写Html文件的类

PageMaker 根据邮件地址编写该用户的Web页面

Main 测试程序的类

示例程序的类图:

源码:

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. public class Database {
  5. private Database() { // 防止外部new出Database的实例,所以声明为private方法
  6. }
  7. public static Properties getProperties(String dbname) { // 根据数据库名获取Properties
  8. String filename = "C:\\Coding\\设计模式\\src\\Facade\\Sample\\pagemaker\\" + dbname + ".txt";
  9. Properties prop = new Properties();
  10. try {
  11. prop.load(new FileInputStream(filename));
  12. } catch (IOException e) {
  13. System.out.println("Warning: " + filename + " is not found.");
  14. }
  15. return prop;
  16. }
  17. }
  1. import java.io.Writer;
  2. import java.io.IOException;
  3. public class HtmlWriter {
  4. private Writer writer;
  5. public HtmlWriter(Writer writer) { // 构造函数
  6. this.writer = writer;
  7. }
  8. public void title(String title) throws IOException { // 输出标题
  9. writer.write("<html>");
  10. writer.write("<head>");
  11. writer.write("<title>" + title + "</title>");
  12. writer.write("</head>");
  13. writer.write("<body>\n");
  14. writer.write("<h1>" + title + "</h1>\n");
  15. }
  16. public void paragraph(String msg) throws IOException { // 输出段落
  17. writer.write("<p>" + msg + "</p>\n");
  18. }
  19. public void link(String href, String caption) throws IOException { // 输出超链接
  20. paragraph("<a href=\"" + href + "\">" + caption + "</a>");
  21. }
  22. public void mailto(String mailaddr, String username) throws IOException { // 输出邮件地址
  23. link("mailto:" + mailaddr, username);
  24. }
  25. public void close() throws IOException { // 结束输出HTML
  26. writer.write("</body>");
  27. writer.write("</html>\n");
  28. writer.close();
  29. }
  30. }
  1. import java.io.FileWriter;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. public class PageMaker {
  5. private PageMaker() { // 防止外部new出PageMaker的实例,所以声明为private方法
  6. }
  7. public static void makeWelcomePage(String mailaddr, String filename) {
  8. try {
  9. Properties mailprop = Database.getProperties("maildata");
  10. String username = mailprop.getProperty(mailaddr);
  11. HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
  12. writer.title("Welcome to " + username + "'s page!");
  13. writer.paragraph("欢迎来到" + username + "的主页。");
  14. writer.paragraph("等着你的邮件哦!");
  15. writer.mailto(mailaddr, username);
  16. writer.close();
  17. System.out.println(filename + " is created for " + mailaddr + " (" + username + ")");
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }

数据:

  1. hyuki@hyuki.com=Hiroshi Yuki
  2. hanako@hyuki.com=Hanako Sato
  3. tomura@hyuki.com=Tomura
  4. mamoru@hyuki.com=Mamoru Takahashi

测试程序:

  1. import Facade.Sample.pagemaker.PageMaker;
  2. public class Main {
  3. public static void main(String[] args) {
  4. PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome设计模式.html");
  5. }
  6. }

总结:

Facade外观模式存在的角色以及在本例子中对应关系:

Facade窗口:

Facade角色是代表其他许多角色的“简单窗口”。Facade角色想系统外部提供高层接口API。在示例中有PageMaker类扮演此角色。

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

这些角色各自完成各自的工作,他们并不知道Facade角色的存在,Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色。在本例子中有

HtmlWriter和Database类扮演此角色。

Client(请求者):

Client角色负责调用Facade角色,Client并是不Facade的一部分,在本示例中由Main类扮演此角色

Facade模式的类图:

总结:这个设计模式我们一般会经常用到,可能在使用过程中我们没有把它当做一种设计模式来理解而已!

源码代码地址:http://git.oschina.net/leodaxin/javapattern ,类图的源文件都在代码仓库中,本人使用的是starUml工具。

一天学习两个设计模式之Facade模式(外观模式,结构型模式)的更多相关文章

  1. (转)Java经典设计模式(2):七大结构型模式(附实例和详解)

    原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式 ...

  2. NET设计模式 第二部分 结构性模式(14):结构型模式专题总结

    ——探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能( ...

  3. 设计模式06: Adapter 适配器模式(结构型模式)

    Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ...

  4. 设计模式09: Decorator 装饰模式(结构型模式)

    Decorator 装饰模式(结构型模式) 子类复子类,子类何其多加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路两 ...

  5. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

  6. NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但 ...

  7. 大话设计模式宏观总结——创建型&amp;结构型&amp;行为型

    师傅验收项目的时候.问大话设计模式那三种类型的差别和联系是什么,顿时我傻了眼.由于除了知道这三种类型分别如何称呼以外.从来都没想过为什么这样划分?于是,我便回答:我没想过这个问题.若是从字面上来理解的 ...

  8. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...

  9. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

随机推荐

  1. springBoot整合Quarzt2.3

    首先,你要配置好springboot的配置(在resources下) 我把其改为application.yml # Tomcat server: tomcat: uri-encoding: UTF-8 ...

  2. .net如何处理高并发socket,建立高性能健壮的socket服务

    看到一个问题,说如何保持5000-10000+的健壮的socket服务. 初学者肯定是会把每个连接都开一个线程来监听.这很浪费资源 通常只会(动态地)占用几个线程就能保持3000个长连接会话了.“为每 ...

  3. Oracle_SQL(3) DML增删改

    sql语言按功能分为:数据定义语言DDL.数据操纵语言DML.数据查询语言DQL.数据控制语言DCL 一.数据操纵语言DML1.insert 新增 语法:insert into <表名> ...

  4. (转)Silverlight调用的JS方法返回对象数组的处理方法

    最近在做Silverlight应用,需要用Silverlight调用页面中Javascript方法.这 个JS方法返回一个对象数组给Silverlight.对于这个对象数组怎么在Silverlight ...

  5. Mac下安装社区版MongoDB

    MongoDB下载地址:https://www.mongodb.com/download-center?_ga=2.98072543.1777419256.1515472368-391344272.1 ...

  6. oracle:the password has expired

    今天在用dbvisualizer登录数据库的时候,报了the password has expired的错误,于是上网查了一下原因,是因为数据库密码过期了,因为默认的是180天. 解决方法: 1)用系 ...

  7. spring自动注解Autowired配置

    1.spring注解:http://blog.csdn.net/xyh820/article/details/7303330/ 2.最简ssm配置:http://blog.csdn.net/qq_18 ...

  8. uuid唯一吗

    是唯一的.我在几台硬件完全相同(同一批购买的).软件也完全相同(用同一个GHOST系统安装)的电脑上试过:  不同的电脑上,wmic csproduct get uuid 获取的UUID码是不同的.另 ...

  9. 会话和http请求

    一次HTTP请求和响应的过程 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> ...

  10. 2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

    传送门 codeforces传送门codeforces传送门codeforces传送门 生成函数好题. 卡场差评至今未过 题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: ...