• 一天学习两个设计模式之Facade模式(外观模式,结构型模式)


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

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

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

    数据:

    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.   
    3. public class Main {  
    4.     public static void main(String[] args) {  
    5.         PageMaker.makeWelcomePage("hyuki@hyuki.com", "welcome设计模式.html");  
    6.     }  
    7. }  



    总结:

    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工具。

  • 相关阅读:
    Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
    Android 自定义控件之圆形扩散View(DiffuseView)
    Android线性渐变
    Android Drawable之getIntrinsicWidth()和getIntrinsicHeight()
    Android 用Handler和Message实现计时效果及其中一些疑问
    CentOS6.5下nginx-1.8.1.tar.gz的单节点搭建(图文详解)
    Zeppelin的入门使用系列之创建新的Notebook(一)
    hadoop报错java.io.IOException: Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured
    ubuntu系统里vi编辑器时,按方向箭头输入是乱码的ABCD字母?(图文详解)
    VirtualBox里如何正确安装增强工具(图文详解)
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/8482896.html
Copyright © 2020-2023  润新知