门面模式简介
门面模式是对象的结构模式,也叫外观模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用,它是一种结构型模式
门面模式有三个角色组成:
- 门面角色( Facade ):门面模式的核心,直接被客户端调用,内部去具体调用子系统或子模块的功能
- 子系统角色(SubSystem):实现子系统的功能,对客户角色未知,提供接口或实现类供门面调用
- 客户角色(Client):调用门面实现功能
门面模式的Java实现
定义子系统角色
package com.facadepattern; /** * 子系统:发送邮件 * * @author yyx 2019年3月7日 */ public class Email { public void sendMessage() { System.out.println("send email to notice customer"); } } package com.facadepattern; /** * 子系统:发送信息 * * @author yyx 2019年3月7日 */ public class Sms { public void sendMessage() { System.out.println("send sms to notice customer"); } }
定义门面角色
package com.facadepattern; /** * 门面角色 * @author yyx * 2019年3月7日 */ public class MessageFacade { private Sms sms; private Email email; public MessageFacade() { sms = new Sms(); email = new Email(); } public void noticeCustomer() { sms.sendMessage(); email.sendMessage(); } }
定义客户角色
package com.facadepattern; public class PatternTest { public static void main(String[] args) { // 客户端直接调用消息门面去通知顾客,不需要知道子系统是怎么发送消息的 MessageFacade messageFacade = new MessageFacade(); messageFacade.noticeCustomer(); } }
门面模式的优点
- 松散耦合。客户端和子系统解耦,子系统相对独立,利于扩展和维护
- 灵活易用。客户端只需和门面交互即可实现功能,不需知道子系统的内部构成和实现,业务更新时也只需修改门面的规则即可
- 层次清晰。子系统把暴露对外的功能通过门面提供统一访问入口,客户端访问需通过上层的门面,系统结构层次更清晰
门面模式的缺点
- 增加新的子系统可能需要修改门面类或客户端,违背了“开闭原则”
门面模式的应用场景
- 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式
- 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度