外观模式(Facade)

Posted dgwblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外观模式(Facade)相关的知识,希望对你有一定的参考价值。

Facade?

如果是按照RUP+ 的开发模式,随着迭代与增量的进行,软件代码会越来越庞大,各个模块之间的关系会越来越复杂,如何你是初次接受该项目的开发非非常棘手,要理解清楚他们之间的关系,才能继续完成下面的工作。不过与其这么做,不如为这个大型程序准备一个“窗口”。这样,我们就不必单独地关注每个类了,只需简单地对“窗口”提出请求即可。

  • 关键字:** 责任关系,依赖关系 ,调用顺序 **

  • 要点概念:提供的窗口可以理解为开辟一个高层的接口

  • 声明时候使用外观设计模式:
    当某个程序员得意地说出“啊,在调用那个类之前需要先调用这个类。在调用那个方法之前需要先在这个类中注册一下”的时候,就意味着我们需要引入Facade角色了。

  • 相关设计模式:

◆Abstract Factory模式(第8章)可以将Abstract Factory 模式看作生成复杂实例时的Facade模式。因为它提供了“要想生成这个实例只需要调用这个方法就OK了”的简单接口。

◆Singleton模式(第5章)有时会使用Singleton模式创建Facade角色。

◆Mediator模式(第16章)在Facade模式中,Facade角色单方面地使用其他角色来提供高层接口(API)。
而在Mediator模式中,Mediator角色作为Colleague角色间的仲裁者负责调停。可以说,Facade模式是单向的,而Mediator角色是双向的。

理解职责

  • 目的:实现读取text文本转为一个网页链接的程序
    包========>类======>解释
    pagemaker |Database 从邮件地址中获取用户名的类
    pagemaker |htmlWriter 编写HTML文件的类
    pagemaker |PageMaker |根据邮件地址编写该用户的Web页面
    |无需package|MainT测试程序行为的类

HtmlWriter :html中隐藏声明要求必须先调用title()而在PageMaker中我们提前就维护好了调用的顺序,后面在MainT不需要关系具体的调用依赖关系。

UML

技术分享图片

类图:
技术分享图片

Code

  • DataBase :
public class DataBase {


    private DataBase(){

    }

    /**
     * 输入文件名读取数据
     * @param filname
     * @return
     */
    public static Properties getProperties(String filname){
        String filename=filname+".ini";
        Properties prop = new Properties();

        try {
            prop.load(new FileInputStream(filename));
        }catch (IOException e){
            e.printStackTrace();
        }
        return prop;
    }
}

  • HtmlWriter :

public class HtmlWriter {

    private Writer printWriter;

    public HtmlWriter(Writer writer) {
        this.printWriter = writer;
    }
    // 输出标题 (这是隐藏条件必须先调用title方法)
    public void title(String title) throws IOException {
        printWriter.write("<html>");
        printWriter.write("<head>");
        printWriter.write("<title>"+title+"</title>");
        printWriter.write("</head>");
        printWriter.write("<body>
");

        printWriter.write("<h1>"+title+"</h1>");
    }
    // 输出段落
    public void paragraph(String msg)throws IOException{
        printWriter.write("<p>"+msg+"</p>");
    }
    // 输出超链接
    public void link(String href,String caption) throws IOException{
        printWriter.write("<a href=""+href+"">"+caption+"</a>");
    }
    // 输出邮件地址
    public void mailto(String mailaddr,String username) throws IOException{
        link("mailto:"+mailaddr,username);
    }

    public void close() throws IOException{
        printWriter.write("</body>");
        printWriter.write("</html>
");
        printWriter.close();
    }
}

  • PageMaker:

public class PageMaker {

    private PageMaker(){

    }

    /**
     * 外观接口
     * @param mailaddr
     * @param filename
     */
    public static void makeWelcomePage(String mailaddr,String filename){
        try {
            Properties mailporo = DataBase.getProperties("testmail");

            String usernmae = mailporo.getProperty(mailaddr);

            HtmlWriter htmlWriter = new HtmlWriter(new FileWriter(filename));

            htmlWriter.title("欢迎来到"+usernmae+"页面!");

            htmlWriter.paragraph(usernmae+"欢迎来到"+usernmae+" 的主页。");

            htmlWriter.paragraph("欢迎给我发送邮件:");

            htmlWriter.link(mailaddr,usernmae);

            htmlWriter.close();

            System.out.println("这是由于"+usernmae+"创建的邮件的主页界面"+ "From to"+usernmae);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

  • MainT:

public class MainT {


    public static void main(String[] args) {

        PageMaker.makeWelcomePage("[email protected]","welcome.html");

    }
}

以上是关于外观模式(Facade)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:外观(Facade)模式

设计模式之外观模式 Facade

设计模式之- 外观模式(Facade Pattern)

外观模式 Facade

外观/门面模式(Facade Pattern)

外观模式(Facade)