设计模式—门面模式

devtools/2024/11/14 20:52:18/

定义:

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

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

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

门面模式优缺点:

优点:

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

缺点:

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

http://www.ppmy.cn/devtools/11007.html

相关文章

API接口的用途以及接入示例

API接口的主要用途是允许不同的软件系统之间进行通信和数据交换。具体来说,API接口可以用于以下几个方面: 数据传输和交换:API接口可以用于不同系统之间的数据传输和交换,例如将数据从一个系统传递到另一个系统,或者从…

Vue打包部署

黑马程序员JavaWeb开发教程 文章目录 一、打包二、部署1、Nginx服务器2、下载Nginx3、部署4、更换Nginx的端口号 一、打包 直接点击NPM脚本下的build 即可 打包完成之后会产生一个dist文件夹,之后部署的时候就是使用dist文件夹下的文件 二、部署 1、Nginx服务器…

k8s的服务Service暴露应用

k8s的服务Service暴露应用 Kubernetes(k8s)是一个开源的容器编排系统,用于自动化应用部署、扩展和管理。在k8s中,Service是管理Pod访问的关键组件,它允许你定义如何访问运行在集群中的Pod。本文将详细介绍Service的概…

基于POI封装的excel实用小工具

依赖文件 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency&…

Day13.一刷数据结构算法(C语言版) 102二叉树的层序遍历;226翻转二叉树;101对称二叉树

一.102二叉树的层序遍历 二叉树的层序遍历力扣题目 1.思路分析 这道题我没有什么好的思路&#xff0c;而且力扣给的函数形式看得有点懵&#xff0c;所以我找到一个相对好理解的题解&#xff0c;具体可以参考下方链接。 力扣题解 说明&#xff1a; 返回值&#xff1a;可…

基本数据类型转换

一 自动类型转换 当java程序在进行赋值或者运算时&#xff0c;精度小的类型自动转换为精度大的数据类型 这个就是自动类型转换。 数据类型按精度(容量)大小排序 char -> int -> long -> float -> doublebyte -> short -> int -> long -> float -> …

spring.factories中配置ApplicationContextInitializer实现类却不起作用

自定义了一个ApplicationContextInitializer的实现类如下 public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {Overridepublic void initialize(ConfigurableApplicationContext applicationCon…

走出“至暗时刻”,托举三只松鼠的力量是什么?

品牌是时代的产物&#xff0c;也随时代而变化。能存在超过十年&#xff0c;依旧欣欣向荣的品牌&#xff0c;身上或多或少都承载了关于穿越周期的哲学。 最近的例子是零食行业的三只松鼠&#xff0c;三只松鼠的创业史&#xff0c;内涵非常丰富&#xff0c;有电商和实体的纠缠&a…