简介
外观模式(Facade Pattern):定义一个高层接口,为子系统中的一组接口提供一个统一的入口,使得这一子系统更加容易使用。
- 客户端与子系统之间的交互复杂,需要外观模式提供统一的接口,简化类之间的交互。又称门面模式,是迪米特法则的一种实现。
结构与实现
- 角色包括:
- 外观角色:供客户端调用,将客户端的请求分配给响应的子系统进行处理,并组织处理流程。
- 子系统角色:每一个子系统可以被客户端直接调用或者经过外观角色调用。
- 外观模式结构。
实例
- 开发一个可以用于多个软件的文件加密模块,需要读取文件、加密、保存加密文件。三部分代码相互独立,为了符合单一职责原则,这三部分代码封装在各自的类中。
- 读取保存文件通过FileInputStream和FileOutputStream实现,加密使用某种加密方式,如求模运算。
抽象外观类
- 外观模式在一定程度上不符合开闭原则,增加新的子系统需要修改外观类。
- 引入抽象外观类,客户端针对抽象编程,通过配置文件动态加载具体外观类。子系统调整只需要增加新的具体外观类。
优缺点和适用环境
- 优点:
- 减少客户端关联的类。使客户端关联子系统的类减少,使用子系统更加容易。
- 实现客户端和子系统的松耦合。子系统相互独立,变化不会影响到其他子系统和客户端,只需要调整外观类。
- 缺点:
- 限制客户端访问困难。如果过多限制客户端访问子系统,则会极大减少可变性和灵活性。
- 可能修改源码。设计不当,增加子系统会修改外观类源码,违背开闭原则。
- 适用环境:
- 为访问一系列复杂子系统提供简单的入口。
- 客户端和子系统之间存在很大依赖。
- 层次化结构中使用外观模式定义每一层的入口,层与层不直接产生联系,降低耦合度。
jdk中的应用
- Class类,提供有关类信息的一系列接口,方便操作类的域、方法等。