设计模式 | 结构型 | 门面模式
2023-06-13 09:17:20 时间
门面模式(Facade)
门面模式(Facade)
介绍
门面模式(外观模式) 是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。
适用场景
- 提供一组更简单易用、更高层的接口,隐藏系统的复杂性。
- 可以解决易用性问题
- 可以解决多次调用的性能问题
- 可以解决简单的分布式事务问题
- ...
优缺点
优点:
- 代码独立于子系统
- 接口隔离原则
- 最少知识原则(迪米特法则)
缺点:
- 外观可能成为与程序中所有类都耦合的上帝对象
与其他模式的关系
- 适配器是做接口转换,解决的是原接口和目标接口不匹配的问题。门面模式做接口整合,解决的是多接口调用带来的问题。
- 只需对客户端隐藏创建过程的话,可以用抽象工厂模式来代替门面模式。
- 一般只要一个门面,可以转换为单例。
- 门面与代理的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。代理与其服务对象遵循同一接口使得自己和服务对象可以互换。
实现方式
- 在一个新的外观类中声明并实现该接口。(如果客户端代码没有对子系统进行初始化,也没有对其后续生命周期进行管理,那么外观必须完成此类工作)
- 客户端代码仅通过外观来与子系统进行交互。(此后客户端代码将不会受到任何由子系统代码修改而造成的影响)
- 如果外观变得过于臃肿,可以考虑将其部分行为抽取为一个新的专用外观类。
示例
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
}
测试代码
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
相关文章
- 23种设计模式之单例模式
- 工厂模式
- C#设计模式——(结构型-外观设计模式)
- Go学设计模式--原型模式的考查点和使用推荐
- 详解设计模式:备忘录模式
- uos系统如何设置开发者模式并获取和使用root权限
- 结构型模式--设计模式详解?
- 设计模式-状态模式
- Java设计模式之访问者模式
- 深入理解 设计模式之工厂模式
- 【嵌入式开发】时钟初始化 ( 时钟相关概念 | 嵌入式时钟体系 | Lock Time | 分频参数设置 | CPU 异步模式设置 | APLL MPLL 时钟频率设置 )
- 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )
- 【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 【设计模式】代理模式 ( 静态代理 )
- 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
- 单例模式 创建型 设计模式(六)详解程序员
- java设计模式之备忘录模式详解架构师
- java设计模式之装饰器模式详解架构师
- 设计模式之桥接模式(结构型)详解架构师
- 用户起诉谷歌浏览器隐身模式仍然追踪数据 这回谷歌可能有点冤枉
- RabbitMQ 3.8.8 发布:引入维护模式
- 模式比较Redis集群与其他集群模式对比优势何在(redis集群与其他集群)
- php设计模式Singleton(单例模式)
- java设计模式之单例模式学习
- 浅谈C#设计模式之代理模式
- 浅谈C#设计模式之工厂模式