前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 | 结构型 | 门面模式

设计模式 | 结构型 | 门面模式

作者头像
被水淹没
发布2023-02-25 19:09:33
2580
发布2023-02-25 19:09:33
举报
文章被收录于专栏:迈向架构师迈向架构师

门面模式(Facade)

门面模式(Facade)

介绍

门面模式(外观模式) 是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。

适用场景

  • 提供一组更简单易用更高层的接口,隐藏系统的复杂性。
    • 可以解决易用性问题
    • 可以解决多次调用的性能问题
    • 可以解决简单的分布式事务问题
  • ...

优缺点

优点:

  • 代码独立于子系统
  • 接口隔离原则
  • 最少知识原则(迪米特法则)

缺点:

  • 外观可能成为与程序中所有类都耦合的上帝对象

与其他模式的关系

  • 适配器是做接口转换,解决的是原接口和目标接口不匹配的问题。门面模式做接口整合,解决的是多接口调用带来的问题。
  • 只需对客户端隐藏创建过程的话,可以用抽象工厂模式来代替门面模式
  • 一般只要一个门面,可以转换为单例
  • 门面代理的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。代理与其服务对象遵循同一接口使得自己和服务对象可以互换。

实现方式

  1. 在一个新的外观类中声明并实现该接口。(如果客户端代码没有对子系统进行初始化,也没有对其后续生命周期进行管理,那么外观必须完成此类工作)
  2. 客户端代码仅通过外观来与子系统进行交互。(此后客户端代码将不会受到任何由子系统代码修改而造成的影响)
  3. 如果外观变得过于臃肿,可以考虑将其部分行为抽取为一个新的专用外观类。

示例

代码语言:javascript
复制
public class Facade {
    /**
     * 传入数据,生成 PDF 文件
     */
    public static DataPdf getPdfData(Data data) {
        // 数据通过模板引擎生成 word
        // 即数据通过模板引擎,套用模板文件(模板.docx)生成出一个新的word文件
        DataWord dataWord = new DataWord(data, "./xxx/xxxx/模板.docx");
        // word 转换成 PDF
        DataPdf dataPdf = new DataPdf(dataWord);
        // PDF 进行加密处理
        dataPdf.encrypt("asd123!@#");

        return dataPdf;
    }
}

public class Data {
    private String title;
    private String content;
    // ... 省略 get set
}

public class DataWord {
    private String title;
    private String content;
    private String template;

    public DataWord(Data data,String template) {
        this.title = data.getTitle();
        this.content = data.getContent();
        this.template = template;
    }
    //... 省略 get
}

public class DataPdf {

    private String title;
    private String content;
    private String pwd;

    public DataPdf(DataWord word) {
        this.title = word.getTitle();
        this.content = word.getContent();
    }

    public void encrypt(String pwd) {
        this.pwd = pwd;
        System.out.println("对当前文档进行加密,密码:" + pwd);
    }

    //... 省略 get
}

测试代码

代码语言:javascript
复制
public class FacadeTest {

    @Test
    public void test() {

        Data data = new Data();
        data.setTitle("标题");
        data.setContent("内容");

        DataPdf pdfData = Facade.getPdfData(data);

        Assertions.assertEquals("标题",pdfData.getTitle());
        Assertions.assertEquals("内容",pdfData.getContent());
        Assertions.assertEquals("asd123!@#",pdfData.getPwd());
    }
}

以上代码与文章会同步到 github 仓库:

/chenbihao/Design-Patterns

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 迈向架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 门面模式(Facade)
    • 介绍
      • 适用场景
        • 优缺点
          • 与其他模式的关系
            • 实现方式
              • 示例
              相关产品与服务
              分布式事务 DTF
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档