定义:
门面模式,也称为外观模式,是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口,从而简化客户端与复杂子系统之间的交互。
在门面模式中,一个门面类充当中介,为客户端提供一个简化了的访问方式,而不需要了解子系统的具体细节。这样不仅降低了客户端与子系统之间的耦合度,还使得子系统的使用更加方便
本章代码:小麻雀icknn/设计模式练习 - Gitee.com
UML类图:
门面模式的构成:
在门面模式中,通常存在两个角色:
- 外观角色(Faced):与客户端交互的类,封装了子系统的交互逻辑,对外提供统一的访问入口。
- 子系统(SubSystem):子系统是一个广义的概念,可以是一个类、一个功能模块或者是一个完整的子系统。子系统能够实现具体的功能。
例子:
外观角色(faced):
package com.study.main.Faced;public class Faced {public SubA subA =new SubA();public SubB subB = new SubB();void doAB(){subA.doSomething();subB.doSomething();}
}
子系统A
package com.study.main.Faced;public class Faced {public SubA subA =new SubA();public SubB subB = new SubB();void doAB(){subA.doSomething();subB.doSomething();}
}
子系统B
package com.study.main.Faced;public class SubB {void doSomething(){System.out.println("B do Something");}
}
测试&运行
package com.study.main.Faced;public class Main {public static void main(String[] args) {new Faced().doAB();}
}
门面模式在源码中的应用 :
在tomcat 中大量的使用了门面模式
Tomcat 中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。在Tomcat源码中搜索Facade(门面):
其中拿ReguestFacade.class来说,它是HttpSeryletRequest外观类,里面封装了各种操作request的常见方法,比如getParameter方法等。
Reguest.class中封装了 HttpRequest 接口能够提供的数据,是子系统的门面。实际项目中对request进行操作的时候,其实使用的都是ReguestFacade这个外观类对象:
使用场景分析 :
一般来讲,门面模式常用的使用场景有以下几种。
- 简化复杂系统。 比如,当我们开发了一整套的电商系统后(包括订单、商品、支付、会。员等系统),我们不能让用户依次使用这些系统后才能完成商品的购买,而是需要一个门户网站或手机 APR 这样简化过的门面系统来提供在线的购物功能。
- 减少客户端处理的系统数量。比如,在 Web 应用中,系统与系统之间的调用可能需要处理 Database 数据库、Model 业务对象等,其中使用 Database 对象就需要处理打开数据库、关闭连接等操作,然后转换为 Model业务对象,:实在是太麻烦了。如果能够创建一个数据库使用的门面(其实就是常说的 DAO 层),那么实现以上过程将变得容易很含
- 让一个系统(或对象)为多个系统(或对象)工作。比如,线程池ThreadPool就是一个门面模式,它为系统提供了统一的线程对象的创建、销毁、使用等。
- 当我们的电商系统中需要一些新功能时,比如,人脸联合更多的系统来扩展原有系统。识别,我们可以不需要自行研发,而是购买别家公司的系统来提供服务,这时通过门面系统就能方便快速地进行扩展。
- 作为一个简洁的中间层。门面模式还可以用来隐藏或者封装系统中的分层结构,同时作为一个简化的中间层来使用。比如,在秒杀、库存、钱包等场景中,我们需要共享有状态的数据时(如商品库存、账户里的钱),在不改变原有系统的前提下,通过一个中间的共享层(如将秒杀活动的商品库存总数统一放在 Redis里),就能统一进行各种服务(如,秒杀详情页、商品详情页、购物车等)的调用。
门面模式优缺点:
优点:
- 简化接口:门面模式提供了一个简单的接口来访问子系统,从而减少了客户端与子系统之间的复杂性。
- 解耦系统:门面模式将客户端与子系统解耦,从而使得子系统的修改不会影响到客户端。
- 提高安全性:门面模式可以限制客户端对子系统的直接访问,从而提高了安全性。
- 提高可维护性:门面模式将系统的复杂性隐藏在门面后面,从而使得系统更容易维护和修改。
缺点:
- 过度使用门面模式可能会导致代码变得复杂和难以维护。
- 门面模式可能会使代码过度耦合,因为所有客户端代码都需要通过门面进行访问。
- 门面模式可能会导致性能问题,因为每次调用门面都需要执行一些额外的代码来处理请求。
- 如果门面过于复杂,可能会导致代码重复和冗余。门面模式可能会限制系统的扩展性,因为所有客户端代码都需要通过门面进行访问,而不能直接访问底层组件