设计模式-门面模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 门面模式和代理模式的区别
    • 代码示例
      • Java实现门面模式
      • Python实现门面模式
    • 门面模式在spring中的应用


模式介绍

门面模式是一种常用的软件设计模式,也称为外观模式。它提供了一个高层次的接口,将一个子系统的外部与内部通信通过一个统一的对象进行,使得子系统更易于使用。门面模式在系统中主要起中介作用,为复杂的子系统提供一个简单的接口,从而降低了系统的耦合度,提高了系统的灵活性和安全性。

在这里插入图片描述

模式特点

  • 门面模式的优点主要包括:
  1. 减少系统的相互依赖 :通过门面模式,外部系统只需要与门面对象交互,而不需要直接深入子系统内部,从而降低了系统的耦合度,提高了系统的可维护性和可扩展性。
  2. 提高灵活性 :无论子系统如何变化,门面模式都可以通过调整门面对象的实现来适应这些变化,而不会影响到外部系统的使用。
  3. 提高安全性 :门面模式限制了外部系统对子系统的访问权限,只允许通过门面对象的方法来访问子系统,从而保护了子系统的内部实现细节,防止不必要的访问和修改。
  • 门面模式的缺点主要包括:
  1. 不符合开闭原则 :开闭原则是指软件实体应该对扩展开放,对修改封闭。而门面模式需要对原有的子系统进行封装和抽象,从而改变原有子系统的结构和行为,因此可能违反开闭原则。
  2. 对维护和修改的要求较高 :由于门面模式需要抽象原有的子系统,因此需要具备一定的系统设计和分析能力,对维护和修改的要求较高。

在这里插入图片描述

应用场景

  1. 为复杂的子系统提供一个简单的接口:当客户只需要使用某个复杂系统的子集或者需要以一种特殊的方式与系统交互时,可以使用门面模式。
  2. 需要跟踪原系统的使用情况:由于所有对系统的访问都经过门面对象,因此可以很容易地监视系统的使用情况。
  3. 希望封装和隐藏原系统时:当需要对原有子系统进行封装和抽象时,可以使用门面模式。
  4. 编写新类的成本小于所有人使用和维护原系统使用所需的成本时:当需要降低低水平开发人员带来的风险时,可以通过门面模式指定其只能在子系统中开发,再通过门面接口进行操作。

在这里插入图片描述

门面模式和代理模式的区别

门面模式和代理模式都是设计模式中的一种,它们在实现方式、目的和使用场景上存在一些区别。

  1. 实现方式 :门面模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,简化了系统的使用。代理模式是为其他对象提供一种代理以控制对这个对象的访问,提供了对原始对象的间接访问。
  2. 目的 :门面模式主要解决易用性问题,将复杂的子系统抽象化,提供更简洁的接口供客户端使用。代理模式则更侧重于控制对对象的访问,提供了更灵活、安全和信息更丰富的访问方式。
  3. 使用场景 :门面模式主要应用在接口设计方面,例如银行柜台办理业务可以理解为门面模式的一种,客户通过银行柜台办理业务,无需了解银行内部复杂的业务逻辑处理。代理模式则适用于需要控制对象访问权限的场景,例如访问网络资源、处理安全敏感的数据等。

门面模式和代理模式都可以起到封装、简化复杂系统的作用,但在使用目的和实现方式上存在区别。根据实际需要解决的问题和场景,选择合适的设计模式可以有效地提高代码质量和系统的可维护性。

在这里插入图片描述

代码示例

Java实现门面模式

以下是一个简单的Java示例,展示了如何使用门面模式来封装一个复杂的子系统:

// 门面类
public class Facade {private SubSystem1 subSystem1;private SubSystem2 subSystem2;public Facade() {subSystem1 = new SubSystem1();subSystem2 = new SubSystem2();}// 提供简单的高层接口public void doSomething() {subSystem1.method1();subSystem2.method2();}
}// 子系统1
public class SubSystem1 {public void method1() {// 实现细节...}
}// 子系统2
public class SubSystem2 {public void method2() {// 实现细节...}
}

在上述示例中,我们创建了一个门面类Facade,它包含了子系统1和子系统2的实例。门面类提供了简单的高层接口doSomething(),通过调用子系统的方法实现了某些功能。客户端代码只需要与门面类交互,而不需要直接与子系统交互,简化了系统的使用。

Python实现门面模式

在Python中实现门面模式也非常直接,我们可以通过创建一个门面类来封装子系统的复杂性。下面是一个Python门面模式的简单示例:

# 子系统类1
class SubSystem1:def operation(self):print("SubSystem1 operation executed.")# 子系统类2
class SubSystem2:def operation(self):print("SubSystem2 operation executed.")# 门面类
class Facade:def __init__(self):self.sub_system1 = SubSystem1()self.sub_system2 = SubSystem2()def unified_operation(self):self.sub_system1.operation()self.sub_system2.operation()# 客户端代码
if __name__ == "__main__":facade = Facade()facade.unified_operation()

在这个示例中,我们有两个子系统类SubSystem1SubSystem2,每个子系统都有自己的操作。然后,我们创建了一个门面类Facade,它封装了子系统的实例,并提供了一个统一的操作方法unified_operation()。客户端代码只需要与门面类交互,通过调用门面类的统一操作方法即可执行子系统的操作。这样,客户端代码不需要了解子系统的具体实现细节,降低了系统的复杂性。

在这里插入图片描述

门面模式在spring中的应用

门面模式在Spring框架中得到了广泛应用,主要用于简化复杂系统的使用。Spring框架提供了许多门面类,例如org.springframework.web.context.support.WebApplicationContext,用于封装Web应用程序的配置和依赖注入。

在Spring中,门面模式通常与依赖注入(Dependency Injection)结合使用。通过依赖注入,Spring框架可以将所需的组件注入到门面类中,从而简化了客户端代码与底层组件之间的交互。

以下是一个简单的示例,展示了如何在Spring中使用门面模式:

  1. 定义门面类:
import org.springframework.stereotype.Component;@Component
public class UserServiceFacade {private final UserService userService;@Autowiredpublic UserServiceFacade(UserService userService) {this.userService = userService;}public void createUser(User user) {userService.createUser(user);}
}

在上述示例中,我们定义了一个名为UserServiceFacade的门面类,它封装了UserService组件的使用。通过使用@Autowired注解,Spring框架会自动将UserService的实例注入到门面类中。

  1. 在客户端代码中使用门面类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class UserController {private final UserServiceFacade userServiceFacade;@Autowiredpublic UserController(UserServiceFacade userServiceFacade) {this.userServiceFacade = userServiceFacade;}public void createUser(User user) {userServiceFacade.createUser(user);}
}

在客户端代码中,我们通过使用@Autowired注解将UserServiceFacade注入到UserController类中。然后,我们可以直接使用门面类的方法来执行所需的操作,而不需要直接与底层组件交互。这样,通过门面模式和依赖注入,我们可以简化客户端代码与底层组件之间的交互,提高代码的可维护性和可扩展性。

在这里插入图片描述

设计模式-外观模式

设计模式-代理模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡通动漫AI绘画视频风格化AI智能PR插件StyleX免费下载

带有AI的视频风格化工具PR AI智能绘画插件。将视频转换为卡通、绘图、绘画、半色调和许多其他风格。 性能高度依赖GPU,一些旧的GPU卡(2012年之前)不受支持。 StyleX是一款先进的视频风格化工具,采用AI技术,它不仅可以将…

代码随想录第三十八天(一刷C语言)|零钱兑换II组合总数和 IV

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、零钱兑换II 思路:参考carl文档 1、确定dp数组以及下标的含义:凑成总金额j的货币组合数为dp[j]。 2、确定递推公式:dp[j] 就是所有的dp[j - coins[i…

仿悬赏猫任务平台源码 悬赏任务系统源码 带支付接口

源码介绍 最新仿悬赏猫任务平台源码 悬赏任务系统源码 带支付接口, 全新开发悬赏任务系统,功能齐全,包含接任务,发布任务, 店铺关注,置顶推荐,排行榜,红包大厅,红包抽奖…

深信服AF防火墙升级步骤(简单粗暴)

设备当前版本:AF8.0.75 升级升级后版本:AF8.0.85 官方发行:内容比较多,找设备当前版本在不在支持升级的列表即可 8.0.75是可以直接升到8.0.85的 升级前注意事项: 升级是需要重启设备的,会断网&#xff…

两种方法解决win10开机慢,经验分享

方法一: 1、按快捷键“winR”打开 运行窗口。 2、这时候输入“msconfig”后 ,点击“确定”或者按“ENTER”键。 3、这时候会打开一个名为“系统配置”的窗口, 在“常规”选项框下 勾选“有选择的启动”下的“加载系统服务”和“加载启动项”。…

C语言的scanf输入函数的介绍分享

各位少年: 我来分享一个输入函数,scanf函数 是输入的函数,scanf(“参数1”,参数2);好,我们接着看代码的例子 int main() { int score0; printf("请输入成绩:"); scanf("%d",&sco…

Android应用-flutter使用Positioned将控件定位到底部中间

文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置,你可以使用MediaQuery来获取屏幕的高度,然后设置Positioned的bottom属性和left或right属性,一般我们left和right都会设置一个值让控制置于合适的位置&#xff0…

【Amazon 实验②】Amazon WAF功能增强之使用Cloudfront、Lambda@Edge阻挡攻击

文章目录 一、方案介绍二、架构图三、部署方案1. 进入Cloud9 编辑器,新打开一个teminal2. 克隆代码3. 解绑上一个实验中Cloudfront 分配绑定的防火墙4. 使用CDK部署方案5. CDK部署完成6. 关联LambdaEdge函数 四、方案效果 一、方案介绍 采用 LambdaEdge DynamoDB 架…

第一部分 数理逻辑

目录 什么是命题 注意: 例1 下列句子中那些是命题? 联结词 例2 将下列命题符号化. 注意: 例4 设 p:天冷,q:小王穿羽绒服,将下列命题符号化 例5 求下列复合命题的真值 例如 真值表: 例&#xff1…

OpenHarmony 4.0 Release发布,同步升级API 10

不久之前,OpenHarmony 正式发布了4.0 版本,开发套件也同步升级到 API 10。相比 3.2 Release 版本,4.0 版本新增 4000 多个 ArkTS API,应用开发能力更加丰富;HDF 新增 200 多个 HDI 接口,硬件适配更加便捷&a…

深度学习数据处理(一)

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。 张量(tensor&…

基于ssm+jsp理发店管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,理发店管理系统也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化&#xff0…

【万能技巧】IP知识速通与小技巧~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构 三、IP实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP3.3 使用IPIDEA进行爬虫实操 前言 各位友友,大家好,马上就到2024年了,…

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用&#xff0c;因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

鸿蒙和各大厂合作,是不是要火起来

今年9月底&#xff0c;在华为秋季全场景新品发布会上&#xff0c;华为常务董事、终端BG CEO余承东宣布&#xff0c;鸿蒙原生应用全面启动&#xff0c;HarmonyOS NEXT开发者预览版将在2024年第一季度开放。 近日&#xff0c;腾讯、阿里、美团、网易&#xff0c;外包大厂中软国际…

微信小程序购物车页面实现

目录 32.商品加入购物车逻辑实现&#xff08;前端&#xff09; 33.购物车页面收货地址实现 34.购物车商品列表显示实现 37.购物车商品复选框选中业务处理 38.购物车全选复选框选中业务处理 39.购物车商品数量编辑实现 40.购物车商品数量为0判定是否删除 42.商品详情立即…

只更新软件,座椅为何能获得加热功能?——一文读懂OTA

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…

FCIS 2023网络安全创新大会-核心PPT资料下载

一、峰会简介 本次会议的主题是“AI大模型、人工智能与智能制造安全、攻击面管理与供应链安全”。 1、AI大模型 会议首先探讨了AI大模型在网络安全领域的应用。AI大模型是一种基于深度学习的模型&#xff0c;具有强大的特征提取和分类能力&#xff0c;可以用于检测和防御各种…

Unity3D移动端实现摇一摇功能

手机摇一摇功能在平时项目开发中是很常见的需求&#xff0c;利用Unity的重力感应可以很方便的实现该功能。 Unity简化了重力感应的开发&#xff0c; 通过访问Input.acceleration属性&#xff0c;取回加速度传感器的值。首先我们看一下重力传感器的方向问题。Unity3D中重量的取…