图解设计模式

图解设计模式--Facade(窗口)模式

2017-09-07  本文已影响18人  Ginger12

简单窗口

Facade 模式

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

示例程序

名字 说明 角色
Database 从邮件地址中获取用户名的类
HtmlWriter 编写 HTML 文件的类
PageMaker 根据邮件地址编写该用户的 Web 页面 Facade
Main 测试程序行为的类 Client

Database.java

package facade;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Database {
    private Database() {    // 防止外部 new 出 Database 的实例,所以声明为 private
    }
    public static Properties getProperties(String dbname) { // 根据数据库名获取 Properties
        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.java

package facade;

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.java

package facade;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class PageMaker {
    private PageMaker() {   //  防止外部 new 出 PageMaker 的实例
    }
    public static void makeWelcomePage(String mailaddr, String filename) {
        try {
            Properties mailprop = Database.getProperties("maildata");
            String username = mailprop.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 for " + mailaddr + " (" + username + ")");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Main.java

package facade;

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

Facade 模式中的角色

  1. Facade(窗口)

    Facade 角色是代表构成系统的许多其他角色的“简单窗口”。Facade 角色向系统外部提供高层接口。

  2. 构成系统的许多其他角色

    这些角色各自完成自己的工作,它们并不知道 Facade 角色。Facade 角色调用其他角色进行工作,但是其他角色不会调用 Facade 角色。

  3. Client

拓展思路

一、Facade 角色的工作是使得接口变少了,这样程序与外部关系弱化,更容易使包被复用。

二、递归的使用 Facade 模式

上一篇 下一篇

猜你喜欢

热点阅读