每日学一个设计模式15——外观模式

外观模式(简单窗口)

用处

隐藏复杂系统,向客户端提供一个可以访问的API

角色

  • Facade(窗口)
    Facade角色使代表构成系统的许多其他角色的就”简单窗口”。
  • 构成系统的许多其他角色
    这些角色各自完成自己的工作,他们并不知道Facade角色。Facade角色调用其他角色进行工作,但是其他角色不会调用Facade角色,
  • Client(请求资源)
    Client角色负责调用Facade角色。

类图在这里插入图片描述

这里Facade类依赖构成系统的许多角色ClassA,ClassB等,Class之间的依赖关系只是表明类之间的关系较为复杂,不是固定的依赖关系。

举例

//Client角色
public class Main {
    public static void main(String[] args) {
        PageMaker.makeWelcomePage("hyuki@hyuki.com","welcome.html");
    }
}
构成系统的其他角色,负责从数据库(.txt)中取数据的类
class Database{
    private Database(){
        //防止new出Database实例,所以声明为private
    }
    public static Properties getProperties(String dbname){
        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;
    }
}

//构成系统的其他角色,负责生成html文件
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>");
        writer.close();
    }
}

//Facade角色
class PageMaker{
    private PageMaker(){
        //防止外部new出PageMaker实例,所以声明为private方法
    }
    //对外部只提供了一个makeWelcomePage接口,这就是一个简单窗口
    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();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

总结

  • 不符合开闭原则,如果增加功能的话,需要增加类,并且需要修改Facade
  • 外观模式让API变少了,使复杂的东西变简单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值