设计模式-门面模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 门面模式和代理模式的区别
    • 代码示例
      • 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;

    @Autowired
    public 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;

    @Autowired
    public UserController(UserServiceFacade userServiceFacade) {
        this.userServiceFacade = userServiceFacade;
    }

    public void createUser(User user) {
        userServiceFacade.createUser(user);
    }
}

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

在这里插入图片描述

设计模式-外观模式

设计模式-代理模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1. 行为模式 - 责任链模式

亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理…

SaaS智慧校园云平台源码,智慧班牌系统,家校互联小程序源码

SaaS智慧校园云平台源码,智慧班牌系统,原生小程序 集智慧教学、智慧教务、智慧校务、智慧办公于一体的校园管理平台源码。集成智能硬件及第三方服务,面向学校、教师、家长、学生,将校内外管理、教学等信息资源进行整合&#xff0c…

vue微乾坤子应用开发及ele组件开发时问题记录

一. 微乾坤 1. 新增page页面路由,pmi权限中心配置正常,跳转链接正确,但路由未找到403. 解决: 新增的配置是page类型,transformQianKunRoute方法转换微前端路由数据 时,过滤未兼容page型的路由, 解决 [menu,…

Android开发——添加图片

1、首先选择一张需要的图片,通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容: *Android 设备具有不同的屏幕尺寸(手机、平板电脑和电视等…

Histcite下载教程

这个安装就很简单了,可以通过百度网盘下载: 链接:https://pan.baidu.com/s/1WVkXnh3LiJJ08nKqmI5LQw?pwdug9c 提取码:ug9c 解压后,将savedress_for_test.txt放入TXT文件当中 双击main.exe文件,输入1或2…

Kubectl 部署简单应用

创建新服务 kubectl create deployment kubernetes-bootcamp --imagegcr.io/google-samples/kubernetes-bootcamp:v1查看 kubectl get deployments打开新的终端执行 kubectl proxy此时,切回上一个终端,通过 kubectl get pods可查看已部署好的pod。并通…

五种简单保护网站安全的方法看这里!

随着互联网的快速发展,随着品牌效应的加大,企业网站已经成为了企业对外展示的明信片,以及宣传获取私有流量的重要渠道。所以保护企业网站安全至关重要。这里我们就来一起了解一下五种简单保护网站安全的方法,仅供参考哦&#xff0…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧机场

智慧机场可视化平台通过可视化手段,将复杂的机场运营数据以图形、图表等形式展现,使管理者能够更直观、实时地了解机场的各个方面。飞渡科技通过整合物联网IOT、人工智能、大数据分析等技术,围绕机场管理、运控、安防、服务、监测等业务领域&…

Python模块导入的相关介绍

浅谈python模块的导入操作 1.什么是模块 在Python中有一个概念叫做模块(module)。所谓模块,就是将代码量较大的程序分割成多个有组织的,彼此独立但双能互相交互的代码片段,这些自我包含的有组织的代码段就是模块。 2.模块的特点 python中…

前端真的没有出路了嘛?不,当然不是!一定不是!绝对不是!

hello world! 一、为什么会出现“前端已死”的言论 作为一个老前端的老公,我认为前端行业的就业前景非常广阔,而且未来也很有潜力。 我认为前端行业的就业前景非常广阔,而且未来也很有潜力。 有些人却唱衰前端这个行业。我觉得这…

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

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

【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 思路 1、继承关系 2、运行时类型检查 结语 我的其他博客 前言 在Java编程中,强制类型转换是一个常见的操作&#xf…

RateLimiter速率了解

RateLimiter <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version> </dependency>这个同名的类在nacos的jar包中也有出现。速率限制于java.util.concurrent.Semaphore功能…

ACL实现固定时间访问资源——项目

文章目录 一、前言二、项目拓扑三、项目需求四、配置思路五、配置步骤1 IP地址2 端口类型3 静态路由4 流策略 六、结语 免责声明 本文旨在提供信息和解决问题的建议&#xff0c;观点和建议可能不适用于个人情况&#xff0c;仅供参考&#xff01;&#xff01;&#xff01; 文章中…

C# WPF上位机开发(软件的发布和部署)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件编译完成之后&#xff0c;本地测试完之后&#xff0c;一般都要发布和部署到客户的电脑上面。客户电脑的配置未必和开发的电脑是一样的&#xf…

02 特征点提取器 ORBextractor

文章目录 02 特征点提取器 ORBextractor2.0 基础知识2.0.1 图像金字塔2.0.2 ORB 特征点的关键点和描述子 2.1 构造函数&#xff1a;ORBextractor()2.2 构建图像金字塔 ComputePyramid()2.3 提取特征点并筛选 ComputeKeyPointsOctTree()2.4 筛选特征点 DistributeOctTree()2.5 计…

springboot+vue前后端分离的社区养老服务管理管理系统(有文档)

springbootvue前后端分离的社区养老服务管理管理系统。系统功能齐全&#xff0c;配置完成可运行&#xff0c;有文档&#xff0c;演示视频&#xff0c;配置说明&#xff0c;数据库文件&#xff0c;虚拟产品下单不退不换&#xff01; 技术&#xff1a;springbootmybatisplusmysql…

NPOI 导出Excel提示内容有问题的解决方法

NPOI导出Excel 使用Microsoft Excel 打开提示内容有问题&#xff0c;如下&#xff1a; 原因是&#xff1a;在使用NPOI导出excel时&#xff0c;获得 workbook.Write(ms)生成的 MemoryStream后&#xff0c;使用了 ms.GetBuffer()返回文件内容&#xff0c;导致生成的 Excel文件结尾…

【读论文】PSFusion

【读论文】Rethinking the necessity of image fusion in high-level vision tasks: A practical infrared and visible image fusion network based on progressive semantic injection and scene fidelity 介绍解决的问题网络架构整体架构稀疏语义感知分支&#xff08; spars…

Jmeter 性能测试 —— 评估一个系统TPS与并发数!

问题&#xff1a;性能压测&#xff0c;如何评估一个系统的TPS和并发数&#xff1f; 1、对于新系统 由业务部门或开发人员预估交易量和TPS指标 可以参考公式&#xff1a;并发用户 在线用户数 * 10%。 当一个系统还没有上线时&#xff0c;我们可以预判的是这个系统准备要给多…