设计模式—门面模式

定义:

门面模式,也称为外观模式,是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口,从而简化客户端与复杂子系统之间的交互。

在门面模式中,一个门面类充当中介,为客户端提供一个简化了的访问方式,而不需要了解子系统的具体细节。这样不仅降低了客户端与子系统之间的耦合度,还使得子系统的使用更加方便

本章代码:小麻雀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里),就能统一进行各种服务(如,秒杀详情页、商品详情页、购物车等)的调用。

门面模式优缺点:

优点:

  • 简化接口:门面模式提供了一个简单的接口来访问子系统,从而减少了客户端与子系统之间的复杂性。
  • 解耦系统:门面模式将客户端与子系统解耦,从而使得子系统的修改不会影响到客户端。
  • 提高安全性:门面模式可以限制客户端对子系统的直接访问,从而提高了安全性。
  • 提高可维护性:门面模式将系统的复杂性隐藏在门面后面,从而使得系统更容易维护和修改。

缺点:

  • 过度使用门面模式可能会导致代码变得复杂和难以维护。
  • 门面模式可能会使代码过度耦合,因为所有客户端代码都需要通过门面进行访问。
  • 门面模式可能会导致性能问题,因为每次调用门面都需要执行一些额外的代码来处理请求。
  • 如果门面过于复杂,可能会导致代码重复和冗余。门面模式可能会限制系统的扩展性,因为所有客户端代码都需要通过门面进行访问,而不能直接访问底层组件
  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值