设计模式(Java)—Facade模式
使用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模式相关推荐
- facade java_Java设计模式之Facade模式
Java设计模式之Facade模式 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...
- 设计模式:Facade模式
Facade模式--简单窗口 当调用大型程序进行处理时,我们需要格外注意那些数量庞大的类之间错综复杂的关系.不过有一种更简单的做法,就是为这个大型程序提供一个"窗口".这样,我们就 ...
- 设计模式--门面(Facade)模式
模式定义 为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用(复用) 类图 应用场景 1.当你需要使用复杂子系统的有限但直接的接口时 ...
- 设计模式之facade模式
从理论上讲facade模式,就是在系统中一个对象需要调用某些相似的功能,而将这些相似的功能进行封装,而留给需要调用的对象一个接口,这个接口不是我们编程意义上的接口,实际可以是一个接口,或者一个类.供调 ...
- C++设计模式之Facade模式(外观模式)
Facade模式(外观模式),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象, ...
- java设计模式之Facade模式
介绍外观模式之前,首先让我们来看下面的例子: 假设我们现有一个对外接口FacadeService,里面有一个对外的方法a(): public interface FacadeService {publ ...
- java单一窗体设计模式,JAVA中设计模式之 -- 单例模式
单例模式中分为饿汉模式.懒汉模式两种 一.创建饿汉模式单例 package com.yiyun; /** 单例模式Singleton 应用场合:有些对象只需要一个就足够了,如古代的皇帝.老婆 作用:保 ...
- Java设计模式 -11- 外观模式(Facade模式)
Java设计模式 -11- 外观模式(Facade模式) 前言 外观模式的定义与特点 优点: 缺点: 外观模式的结构与实现 1. 模式的结构 2. 模式的实现 外观模式的应用实例 外观模式的应用场景 ...
- 【JAVA设计模式】外观模式(Facade Pattern)
一 定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二 案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...
- Java设计模式分为创建模式, 结构模式, 行为模式 3种类型
Java设计模式之创建模式包括: Factory, 工厂模式 Singleton, 单例模式 Builder, 建造模式 Prototype, 原型模式 Java设计模式之结构模 ...
最新文章
- cytoscape---插件clueGO的使用
- 使用扩展的 CodeIgniter 框架实现 RESTful 框架
- XamarinAndroid组件教程设置自定义子元素动画(一)
- 百度Create2021:百度地图日均位置服务请求次数突破1300亿
- 50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
- leetcode1487. 保证文件名唯一
- android8.0更新手机,安卓微信8.0.6正式更新:可发1G大文件、表情互动等多项更新!...
- 推荐一个wpfsliverlight的图表控件
- 50个最有价值的数据可视化图表
- STL之string
- mysql优化 知乎_MYSQL优化
- Linux 共享文件夹
- 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
- html表格外边框粗细,table细边框
- 三分钟看懂二极管的所有基础知识点
- 夜深人静写算法(六)- 最近公共祖先
- 关于soundfile写音频是报错raise RuntimeError(prefix + _ffi.string(err_str).decode(‘utf-8‘, ‘replace‘))
- 树莓派3+安装centos
- 函数模板案例—选择排序
- 人物志-丘吉尔 Success consists of going from failure to failure without loss of enthusiasm. —— Winston Chu