使用Facade模式可以为互相关联在一起的错综复杂的类整理出高层接口,其中的Facade角色可以让系统对外只有一个简单的接口。

示例程序
该程序只有三个简单类,一个是用于从邮件地址中获取用户名字的数据库类,一个用于编写HTML文件的类,以及一个扮演Facade角色并提供高层接口的类。

Database类
Database类可获取指定数据库名所对应的Properties的实例,我们无法生成该类的任何实例,只能通过它的getProperties静态方法获取Properties的实例。

package Facade;import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;public class Database {private Database(){}//防止外部new出Database的实例,所以声明为privatepublic static Properties getProperties(String dbname){String filename = dbname+".txt";Properties properties = new Properties();try {properties.load(new FileInputStream(filename));} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}return properties;}}

数据文件(maildata.txt)

hyuki@hyuki.com=Hirohi yuki
hanako@hyuki.com=Hanako stao
tomurah@yuki.com=Tomura hioq
mamoru@hyuki.com=Mamoru shio

数据文件路径

HtmlWriter类
该类用于编写简单的Web页面,我们在生成HtmlWriter类的时候赋予其Writer,然后使用该Writer输出HTML。

package Facade;import java.io.IOException;
import java.io.Writer;public class HtmlWriter {private Writer writer;public HtmlWriter(Writer writer) {// TODO Auto-generated constructor stubthis.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>");writer.close();}
}

PageMaker类
该类使用Database类和HtmlWrite类来生成指定用户的Web页面。

package Facade;import java.io.FileWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;public class PageMaker {private PageMaker(){}public static void makeWelcomePage(String mailaddr,String filename){try {Properties mailpop = Database.getProperties("maildata");String username = mailpop.getProperty(mailaddr);HtmlWriter writer = new HtmlWriter(new FileWriter(filename));writer.title("Welcome to"+username+"'s page!");writer.paragraph(username+"欢迎来到"+username+"的主页");writer.paragraph("等着你的邮件!");writer.mailto(mailaddr, username);writer.close();System.out.println(filename+" is created by "+mailaddr+" ("+username+" )");} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

对外只提供makeWelcomePage接口。

Main类

package Facade;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubPageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome.html");}}

程序中如果有很多类和方法,我们决定到底应该使用哪个类或是方法时就很迷茫。有时,类和方法的调用顺序也很容易弄错,必须格外注意。因此,如果有一个能使接口变少的Facade角色是一件多么美好的事情。
接口变少意味着程序与外部的关系弱化了,这样更容易使我们的包作为组件被复用。

练习:
在PageMaker类中增加一个makeLinkPage方法,使其可以依据文件中的用户邮件地址制作出邮件地址超链接集合。
PageMaker类

package Facade;import java.io.FileWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;public class PageMaker {private PageMaker(){}public static void makeWelcomePage(String mailaddr,String filename){try {Properties mailpop = Database.getProperties("maildata");String username = mailpop.getProperty(mailaddr);HtmlWriter writer = new HtmlWriter(new FileWriter(filename));writer.title("Welcome to"+username+"'s page!");writer.paragraph(username+"欢迎来到"+username+"的主页");writer.paragraph("等着你的邮件!");writer.mailto(mailaddr, username);writer.close();System.out.println(filename+" is created by "+mailaddr+" ("+username+" )");} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}public static void makeLinkPage(String filename){try {Properties mailpop = Database.getProperties("maildata");HtmlWriter writer = new HtmlWriter(new FileWriter(filename));writer.title("Linkpage");Enumeration enumeration = mailpop.propertyNames();while(enumeration.hasMoreElements()){String mailaddr = (String)enumeration.nextElement();String username = mailpop.getProperty(mailaddr,"(unknown)");writer.mailto(mailaddr, username);}writer.close();System.out.println(filename + "  is created.");} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

Main类

package Facade;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubPageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome.html");PageMaker.makeLinkPage("linkpage.html");}}

设计模式(Java)—Facade模式相关推荐

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

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

  2. 设计模式:Facade模式

    Facade模式--简单窗口 当调用大型程序进行处理时,我们需要格外注意那些数量庞大的类之间错综复杂的关系.不过有一种更简单的做法,就是为这个大型程序提供一个"窗口".这样,我们就 ...

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

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

  4. 设计模式之facade模式

    从理论上讲facade模式,就是在系统中一个对象需要调用某些相似的功能,而将这些相似的功能进行封装,而留给需要调用的对象一个接口,这个接口不是我们编程意义上的接口,实际可以是一个接口,或者一个类.供调 ...

  5. C++设计模式之Facade模式(外观模式)

    Facade模式(外观模式),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象, ...

  6. java设计模式之Facade模式

    介绍外观模式之前,首先让我们来看下面的例子: 假设我们现有一个对外接口FacadeService,里面有一个对外的方法a(): public interface FacadeService {publ ...

  7. java单一窗体设计模式,JAVA中设计模式之 -- 单例模式

    单例模式中分为饿汉模式.懒汉模式两种 一.创建饿汉模式单例 package com.yiyun; /** 单例模式Singleton 应用场合:有些对象只需要一个就足够了,如古代的皇帝.老婆 作用:保 ...

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

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

  9. 【JAVA设计模式】外观模式(Facade Pattern)

    一  定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二  案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...

  10. Java设计模式分为创建模式, 结构模式, 行为模式 3种类型

    Java设计模式之创建模式包括: Factory,    工厂模式 Singleton,   单例模式 Builder,    建造模式 Prototype,    原型模式 Java设计模式之结构模 ...

最新文章

  1. cytoscape---插件clueGO的使用
  2. 使用扩展的 CodeIgniter 框架实现 RESTful 框架
  3. XamarinAndroid组件教程设置自定义子元素动画(一)
  4. 百度Create2021:百度地图日均位置服务请求次数突破1300亿
  5. 50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
  6. leetcode1487. 保证文件名唯一
  7. android8.0更新手机,安卓微信8.0.6正式更新:可发1G大文件、表情互动等多项更新!...
  8. 推荐一个wpfsliverlight的图表控件
  9. 50个最有价值的数据可视化图表
  10. STL之string
  11. mysql优化 知乎_MYSQL优化
  12. Linux 共享文件夹
  13. 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
  14. html表格外边框粗细,table细边框
  15. 三分钟看懂二极管的所有基础知识点
  16. 夜深人静写算法(六)- 最近公共祖先
  17. 关于soundfile写音频是报错raise RuntimeError(prefix + _ffi.string(err_str).decode(‘utf-8‘, ‘replace‘))
  18. 树莓派3+安装centos
  19. 函数模板案例—选择排序
  20. 人物志-丘吉尔 Success consists of going from failure to failure without loss of enthusiasm. —— Winston Chu

热门文章

  1. 数据库学习总结与心得
  2. Win32扫雷(根据以前的控制台扫雷实现)
  3. FreeCAD开发:修改了源码,需要翻译成中文,如何更新语言包
  4. NetSetMan IP快速切换
  5. java需要知道哪些英语单词_70个学习JAVA必背的英语单词,了解下
  6. 单片机炫彩灯实训报告_单片机实验报告——流水灯
  7. 计算机绘图AUTOcad2007证要考吗,计算机绘图和 与考证(AutoCAD2005).ppt
  8. mac系统如何修改默认打开方式
  9. abaqus更改计算机名,ABAQUS 2016 安装教程
  10. 光模块基础知识【快速入门】02