【设计模式】门面模式

news/2025/2/22 18:57:28/

文章目录

  • 1.门面模式定义
  • 2. 门面模式的角色
  • 3.门面模式实战案例
    • 3.1.场景说明
    • 3.2.关系图
    • 3.3.代码实现
  • 4.门面模式优缺点
  • 5.门面模式适用场景
  • 6.门面模式总结

在这里插入图片描述

主页传送门:💁 传送

1.门面模式定义

       门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式。其定义如下:

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.

       即:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。 门面模式提供一个高层次的接口,使得子系统更易于使用。
       其通用类图如下:
在这里插入图片描述

2. 门面模式的角色

在门面模式中,出现了两个角色:

  • 门面(Facade)角色 :
    客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • 子系统(SubSystem)角色 :
    可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

3.门面模式实战案例

3.1.场景说明

       下面我们写一个简单的电脑启动的例子( 这个例子在许多设计模式教程中都曾出现,笔者认为这是最好的例子之一,直接借用了 )。
启动电脑我们通常只需要按下开机键就可以了,但电脑内部实际上启动了多个模块,如 CPU,硬盘,内存等。

3.2.关系图

       使用门面模式来实现的结构图如下:
在这里插入图片描述

3.3.代码实现

开机键就是一个很好的门面,让程序员们无需了解 CPU 、内存和硬盘如何启动。

//CPU
public class CPU {public void start(){System.out.println("启动CPU");}
}
//硬盘
public class Disk {public void start(){System.out.println("启动硬盘");}
}
//内存
public class Memory {public void start(){System.out.println("启动内存");}
}

如果没有开机键,我们需要这么做:

new CPU().start();
new Disk().start();
new Memory().start();

有了开机键,这些操作都交给开机键去做:

//开机键
public class StartBtn {public void start(){new CPU().start();new Disk().start();new Memory().start();}
}

而我们只需要:

new StartBtn().start();

4.门面模式优缺点

门面模式的优点包括:

  • 减少系统的相互依赖:门面模式可以让客户端只需要依赖门面对象,而与子系统无关,从而降低了系统耦合。
  • 提高灵活性:只要不修改门面对象的对外接口,不管子系统内部如何变化,都不会影响到客户端,因此提高了系统的灵活性。
  • 提高安全性:外部只能通过门面访问子系统的功能,门面没有开放的就不能访问,从而提高了子系统的安全性。

门面模式的缺点包括:

  • 不符合开闭原则,当需要修改子系统功能时,需要修改门面角色的代码,风险较大。
  • 如果门面角色与底层实现紧密耦合,修改底层实现时可能需要同时修改门面角色,增加了维护的难度和成本。

5.门面模式适用场景

门面模式适用于以下场景:

  1. 为一个复杂的模块或子系统提供一个简洁的供外界访问的接口。这是门面模式最常用的应用场景,通过门面模式,客户端可以更加方便地使用子系统的功能,而无需了解子系统的内部实现细节。
  2. 希望提高子系统的独立性。门面模式可以提供一个统一的接口,将客户端与子系统隔离开来,从而降低了客户端对子系统的依赖程度,提高了子系统的独立性和可维护性。
  3. 当子系统由于不可避免的暂时原因导致可能存在bug,可以通过门面模式提供一个高层接口,隔离客户端与子系统的直接交互,预防代码污染。在这种情况下,门面模式可以提供一个过渡层,避免客户端直接访问可能存在问题的子系统,从而提高了系统的稳定性和可靠性。

需要注意的是,当子系统需要频繁地修改或扩展时,门面模式可能会增加额外的开发成本和维护难度,因为每次修改或扩展都需要同时修改门面角色和底层实现。因此,在选择是否使用门面模式时,需要根据实际情况权衡利弊。

6.门面模式总结

     门面模式是一种结构性设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。门面模式的主要目的是将复杂的子系统封装起来,提供一个更简单的接口,使子系统更容易使用。
     门面模式适用于为复杂的模块或子系统提供一个简洁的访问接口、提高子系统的独立性和稳定性等场景。然而,在使用门面模式时需要注意开闭原则的问题,以及门面角色和底层实现之间的耦合度,以避免引入额外的维护问题和风险。

如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞


http://www.ppmy.cn/news/1123556.html

相关文章

【linux】性能优化

这张图谱出自倪朋飞; 1、什么是性能指标 这里一定会想到 “高并发” 和 “响应快”,这里词正对应的就是 “吞吐” 和 “延时”。我们知道随着应用负载的体系,系统资源的使用就会提高,甚至达到极限。而性能问题的本质&#xff0c…

NextJS 引入 Ant-Design 样式闪烁问题

按照这里给的样例,抽出关键代码即可 步骤: 安装包: npm i ant-design/static-style-extract引入这俩文件 genAntdCss.tsx: 会帮我们生成 ./public/antd.min.css // src/scripts/genAntdCss.tsximport { extractStyle } from "ant-d…

C++学习笔记--移动语义和右值引用:现代C++基础

文章目录 前言:2.1、值类别2.1.1、左值和纯右值的对比2.1.2、亡值2.1.3、可以“移动”的对象2.1.4、何时使用std::move转换2.1.5、值类型总结 2.2、右值引用2.3、充分利用移动语义2.4、this指针类型 前言: 接上文 接下来将介绍在C11中的移动语义、值类别…

【跟小嘉学 PHP 程序设计】二、PHP 基本语法

系列文章目录 【跟小嘉学 PHP 程序设计】一、PHP 开发环境搭建 【跟小嘉学 PHP 程序设计】二、PHP 基本语法 文章目录 系列文章目录@[TOC](文章目录)前言一、PHP基本语法1.1、hello,world1.2、PHP语法的其他形式1.2.1、简短形式(了解即可)1.2.2、Script 风格1.2.3、ASP 风格1…

Go 多版本管理工具

Go 多版本管理工具 文章目录 Go 多版本管理工具一、go get 命令1.1 使用方法: 二、Goenv三、GVM (Go Version Manager)四、voidint/g4.1 安装4.2 冲突4.3 使用 在平时开发中,本地新旧项目并行开发的过程中,你大概率会遇到一个令人头疼的问题&…

Bug排查思路

遇到一个Bug,怎么排查?以下几个思路,希望能对大家有所启发 一、环境问题 1、开发的代码是否已更新 2、是否是缓存原因导致的(强刷,手动清除缓存,web甚至可以直接用无恒模式查看页面) 3、是否…

Spring面试题19:说一说Spring注解?什么是基于Java的Spring注解配置?什么是基于注解的容器配置?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring注解 Spring注解是一种在Spring框架中使用的特殊标记,用于在应用程序中声明特定的配置、行为或功能。注解可以应用于类、方法、字段…

web:[ACTF2020 新生赛]Include

前提知识 文件包含漏洞 php伪协议 题目 点开题目,页面只显示一个tips,点进去看看 点进去之后 没有别的提示,先看源代码,恩,什么都没有 再看一下点进tips显示的页面,发现url中 flag可能就藏在这个页面中&…