【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

👈️上一篇:桥接模式    |   下一篇:享元模式👉️

设计模式-专栏👈️

目 录

  • 外观模式(Facade Pattern)
  • 定义
    • 英文原文
    • 直译
    • 如何理解呢?
      • 字面理解
      • 代码实现中的理解
      • 生活案例:操作多功能料理机
      • 典型案例分析:API网关与外观模式
  • 外观模式角色
    • UML类图
    • 外观(Facade)
    • 子系统(Subsystem)
    • 客户(Client)
    • 代码示例
      • 子系统角色:SubsystemOne
      • 子系统角色:SubsystemTwo
      • 外观角色:Facade
      • 客户端角色:Client
  • 外观模式的应用
  • 外观模式的优点
  • 外观模式的缺点
  • 外观模式的使用场景
  • 示例解析:电脑开关按钮
    • 代码示例
      • UML类图
      • 子系统角色:电脑内部的复杂组件
      • 外观类(电源开关按钮)
      • 客户端

外观模式(Facade Pattern)

外观模式(Facade Pattern),如同一位精明的“外交官”,它简化了客户端与复杂子系统之间的交互,通过提供一个统一的“外交”接口,使得客户端无需深究子系统内部的“政治斗争”,从而降低了系统的复杂度,提高了代码的可维护性和可读性。

==>本文示例源码,点击查看👈️<==

定义

英文原文

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

直译

外观模式为子系统中的一组接口提供了一个统一的接口。外观定义了一个更高层次的接口,使得子系统更加容易使用。

如何理解呢?

字面理解

外观即外表、外观面,是事物对外展示的一面。

代码实现中的理解

在代码实现中,外观角色就像是系统的“外表”,它隐藏了内部的子系统细节,为客户端提供了一个统一的接口来访问子系统。

生活案例:操作多功能料理机

想象一下,当我们正在使用一个复杂的厨房设备,比如多功能料理机。这个料理机内部可能包含了榨汁机、搅拌机、研磨机等多种功能。

但是,我们并不需要直接操作这些功能,只需要通过一个简单的控制面板就能完成我们想要的操作。

这个控制面板就是外观模式的一个实际应用。它隐藏了料理机内部的复杂性,为我们提供了一个简单、直观的操作方式。

同样地,在软件系统中,外观模式也为我们隐藏了复杂的内部结构和交互,使得我们能够更加方便地使用系统。

典型案例分析:API网关与外观模式

微服务架构中的API网关,为客户端提供了统一的访问入口,是进入系统的唯一节点,这与外观模式的定义相符。API网关封装了内部系统的架构,并且提供API给各个客户端。

网关处理非业务逻辑(如认证、授权、负载均衡、缓存、熔断、降级、限流等),使得业务微服务更加专注于业务实现。

具体表现为:

  1. 隐藏后端服务的复杂性

    在微服务架构中,后端通常包含多个独立的服务,每个服务都有自己的接口、功能和数据。这些服务之间可能存在复杂的依赖关系和交互逻辑。API网关作为一个中间件,隐藏了这些复杂性,为前端提供了一个统一、简洁的接口。前端开发者无需为每一个后端微服务单独配置地址和端口,只需要知道API网关的地址即可。因此,前端开发者无需关心后端服务的具体实现和部署情况,只需与API网关进行交互即可。

  2. 服务聚合

    当一个前端请求需要多个后端微服务协同处理时,API网关可以聚合这些微服务的响应,并将结果合并后返回给前端。

    API网关能够隐藏后端服务的复杂性,这减少了前端的复杂性,为前端提供一个简洁的响应,使得前端能够专注于与用户的交互和展示逻辑。

  3. 统一接口和协议

    API网关为前端提供了统一的接口和协议,使得前端开发者能够以统一的方式与后端服务进行通信。这样,即使后端服务的接口发生变化或新增了服务,只要API网关的接口保持不变,前端代码就无需修改。这种统一性减少了前端与后端之间的耦合度,使得前端可以更加灵活地与后端进行交互。

  4. 认证和授权

    API网关可以实施身份验证和授权机制,确保只有合法的用户、经过认证的请求才能访问后端服务。

    它可以通过OAuth2.0、JWT等技术实现用户认证和令牌管理,保护后端服务免受非法访问。API网关成为安全性的守护者,为后端服务提供一层保护。

  5. 限流和熔断

    API网关可以对流量进行限制,防止后端服务因过载而崩溃。

    当某个微服务出现故障时,API网关可以自动熔断对该微服务的调用,避免故障扩散到其他服务,避免级联故障的发生。

    API网关能够控制和管理后端服务的访问,确保系统的稳定性和可靠性。

  6. 路由和请求转发

    API网关能够根据预设的路由规则,将前端的请求转发到后端对应的服务上。这种路由机制使得前端无需关心后端服务的具体地址和端口,只需发送请求到API网关即可。同时,API网关还可以根据服务的负载情况、健康状况等因素进行负载均衡和容错处理,进一步降低前端与后端之间的耦合度。

  7. 负载均衡

    一个网关可以接收多个服务实例,因此网关需要在各个对等的服务实例上做负载均衡策略。

  8. 降低服务间的耦合度

    通过将非业务逻辑(如路由、转发、认证、授权、熔断、限流等)放在API网关中实现,可以使得后台业务微服务更加专注于业务逻辑的实现,实现业务与技术的解耦。

    通过API网关的路由转发机制,前端与后端之间的耦合度被大大降低。前端开发者无需关心后端服务的具体实现和部署情况,只需与API网关进行交互即可。同时,后端服务无需直接关注前端发送的具体请求细节,包括请求的参数、格式等,同时也无需直接处理针对前端的响应格式。它们只需按照与API网关或其他服务调用者约定的接口规范,处理接收到的请求数据,并返回符合规范的数据格式。

  9. 日志和监控

    API网关可以记录所有经过的请求日志,方便后续的故障排查、性能分析和安全审计。

    收集API的调用量、响应时间、错误率等关键指标,为系统监控和性能调优提供数据支持。

通过外观模式的实现,API网关在前后端分离的微服务架构中发挥着至关重要的作用。它简化了前端的配置和开发过程,提高了系统的可扩展性、可靠性和安全性。同时,API网关还提供了路由、认证、限流、监控等核心功能,使得微服务架构更加完善和高效。

外观模式角色

UML类图

在这里插入图片描述

外观(Facade)

为子系统中的一组接口提供一个一致的界面,此界面使得这一子系统更加容易使用。

子系统(Subsystem)

实现系统的部分功能,客户可以通过外观角色与其进行交互。

客户(Client)

通过外观角色与子系统交互,使用子系统的功能。

代码示例

子系统角色:SubsystemOne

package com.polaris.designpattern.list2.structural.pattern6.facade.classicdemo;// 子系统角色:SubsystemOne
public class SubsystemOne {public void methodOne() {System.out.println("SubsystemOne: Method 1 executed.");}
}  

子系统角色:SubsystemTwo

package com.polaris.designpattern.list2.structural.pattern6.facade.classicdemo;// 子系统角色:SubsystemTwo  
public class SubsystemTwo {public void methodTwo() {System.out.println("SubsystemTwo: Method 2 executed.");}
}  

外观角色:Facade

package com.polaris.designpattern.list2.structural.pattern6.facade.classicdemo;// 外观角色:Facade  
public class Facade {private SubsystemOne subsystemOne;private SubsystemTwo subsystemTwo;public Facade() {subsystemOne = new SubsystemOne();subsystemTwo = new SubsystemTwo();}// 提供单独调用子系统一的方法  public void operationOne() {subsystemOne.methodOne();}// 提供单独调用子系统二的方法  public void operationTwo() {subsystemTwo.methodTwo();}// 提供同时调用两个子系统方法的方法  public void operation() {operationOne();operationTwo();}
}  

客户端角色:Client

package com.polaris.designpattern.list2.structural.pattern6.facade.classicdemo;// 客户端角色:Client  
public class Client {public static void main(String[] args) {Facade facade = new Facade();// 单独调用子系统一的方法  facade.operationOne();System.out.println("------------------");// 单独调用子系统二的方法  facade.operationTwo();System.out.println("------------------");// 同时调用两个子系统的方法  facade.operation();}
}
/* Output:
SubsystemOne: Method 1 executed.
------------------
SubsystemTwo: Method 2 executed.
------------------
SubsystemOne: Method 1 executed.
SubsystemTwo: Method 2 executed.
*///~

外观模式的应用

外观模式就像是我们日常生活中使用的智能手机界面。手机内部可能包含了各种复杂的硬件和软件,但对外,我们只需要通过一个简单、直观的界面就能完成打电话、发信息、拍照、上网等各种功能。这个界面就是外观模式的一个应用,它隐藏了内部的复杂性,为用户提供了一个统一的、简单的操作方式。

外观模式的优点

  1. 简化操作:外观模式为用户提供了一个统一的接口,用户无需了解内部复杂的结构,只需通过外观接口就能完成所需的操作。
  2. 降低耦合度:外观模式使得子系统之间的耦合度降低,因为它们之间的交互都是通过外观接口进行的,而不是直接交互。
  3. 提高灵活性:当子系统内部发生变化时,只需要修改外观接口的实现,而无需修改客户端代码,提高了系统的灵活性。

外观模式的缺点

  1. 增加复杂性:在某些情况下,如果设计不当,外观类可能会变得非常复杂,从而增加了系统的复杂性。
  2. 依赖风险:由于客户端都依赖于外观接口,因此如果外观接口设计不合理或出现问题,可能会导致整个系统的崩溃。

外观模式的使用场景

  1. 子系统之间交互复杂:当系统内部有多个子系统,并且子系统之间的交互非常复杂时,可以使用外观模式来简化它们之间的交互。
  2. 需要隐藏子系统细节:在某些情况下,我们可能不希望用户或客户端直接访问子系统的内部细节。此时,可以使用外观模式来隐藏这些细节,只提供一个统一的接口供用户访问。
  3. 提高系统灵活性和可扩展性:当系统需要经常添加或删除子系统时,使用外观模式可以使得客户端代码不随子系统的变化而变化,从而提高了系统的灵活性和可扩展性。

示例解析:电脑开关按钮

==>本文示例源码,点击查看👈️<==

我们可以使用“电脑开关机”作为一个更简单且常见的外观模式例子。

电脑内部有很多复杂的硬件和软件组件,如处理器、内存、硬盘、操作系统等。但是,当我们想要打开电脑或关闭电脑时,我们并不需要直接与这些组件交互,而是通过一个统一的接口——电源开关按钮来完成。

我们并不需要了解电脑内部复杂的构造和工作原理,只需要按下电源开关按钮,电脑就会开始启动;再次按下按钮,电脑就会关机。

电源开关按钮就是外观模式的一个实际应用,它隐藏了电脑内部复杂的启动和关闭过程,为用户提供了一个简单、直观的操作方式。

代码示例

UML类图

在这里插入图片描述

子系统角色:电脑内部的复杂组件

package com.polaris.designpattern.list2.structural.pattern6.facade.computerfacade;// 电脑内部的复杂组件(这里只是示意)
public class ComputerHardware {public void startUp() {System.out.println("Starting up the computer...");// 这里会执行一系列复杂的启动过程,如加载操作系统、初始化硬件等  }public void shutDown() {System.out.println("Shutting down the computer...");// 这里会执行一系列复杂的关闭过程,如保存数据、关闭应用程序、关闭硬件等  }
}  

外观类(电源开关按钮)

package com.polaris.designpattern.list2.structural.pattern6.facade.computerfacade;// 外观类(电源开关按钮)
public class PowerButton {private ComputerHardware hardware;public PowerButton() {hardware = new ComputerHardware();}// 统一的接口,用户只需调用此方法即可启动电脑  public void pressToStart() {hardware.startUp();}// 统一的接口,用户只需调用此方法即可关闭电脑  public void pressToShutDown() {hardware.shutDown();}
}  

客户端

package com.polaris.designpattern.list2.structural.pattern6.facade.computerfacade;// 客户端代码(用户)  
public class User {public static void main(String[] args) {PowerButton powerButton = new PowerButton();powerButton.pressToStart(); // 启动电脑  // ... 用户使用电脑 ...  powerButton.pressToShutDown(); // 关闭电脑  }
}/* Output:
Starting up the computer...
Shutting down the computer...
*///~

在这个代码示例中,

ComputerHardware 类代表电脑内部的复杂组件,它提供了启动和关闭电脑的方法。

PowerButton 类是外观类,它隐藏了电脑内部复杂的启动和关闭过程,并为用户提供了一个统一的接口——电源开关按钮。

用户(即客户端)只需要与 PowerButton 类交互,就能控制电脑的启动和关闭,而无需关心电脑内部是如何工作的。

👈️上一篇:桥接模式    |   下一篇:享元模式👉️

设计模式-专栏👈️

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

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

相关文章

ARM32开发——串口输入

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据接收中断函数IDLE中断串口接收流程&#xff08;了解&#xff09;完整示例 需求 串口接收PC机发送的数据。 串口数据接…

html+CSS+js部分基础运用13

一、三级联动 效果如下图所示&#xff1a; 图1 三级联动 二、设计江苏福彩投注站彩票投注助手 编程实现江苏福彩投注站彩票投注助手&#xff0c;页面布局效果如图2所示。 图2福彩投注站彩票助手页面 功能要求如下&#xff1a; 单击“机选1注”、“机选5注”或“机选10注”…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心&#xff0c;所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

香港移民政策放开了,2024拿香港身份的8种方式,申请条件解读

​香港移民政策放开了&#xff0c;2024拿香港身份的8种方式&#xff01; 都2024年了&#xff0c;香港身份还受欢迎吗&#xff1f; 当然受欢迎&#xff0c;我们从数据上就能看出来&#xff0c;去年有超过24万人通过各类人才引入计划申请来港&#xff0c;其中超过14万获批&…

静态网页实现-人脸识别-案例(web)

&#x1f933;人脸识别&#xff08;web) 基于开源大模型&#xff0c;将人脸识别功能整合到网页中&#xff0c;提供用户友好的界面和强大的功能。 核心功能 人脸轮廓识别&#xff1a; 通过深度学习算法&#xff0c;精确识别人脸的轮廓&#xff0c;包括眼睛、鼻子、嘴巴等关键部…

在QML中调用 C++ 函数的方法(四)

文章目录 前言一、qml 和 c++ 交互的官方文档介绍二、QML 中调用 C++ 实现的函数的方法1. Exposing Attributes of C++ Types to QML1.1 暴露 Properties1.2 暴露 Methods(槽函数和Q_INVOKABLE 修饰的函数)1.3 暴露 Signals2. Defining QML Types from C++3. 代码实例3.1 创建一…

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )

文章目录 一、ArkTS Component 自定义组件生命周期1、自定义组件生命周期2、aboutToAppear 函数执行时机和作用3、aboutToDisappear 函数执行时机和作用4、代码示例 二、ArkTS Entry 页面生命周期1、Entry 页面生命周期2、onBackPress 和 onPageHide 回调函数无关联 三、代码示…

文化若想挣钱,真的很可怕吗?

文化若想挣钱&#xff0c;真的很可怕吗&#xff1f; 近日&#xff0c;我看到受人尊敬的静思有我先生的一个音频作品《会挣钱&#xff0c;遇上有文化&#xff0c;这个地方很可怕》&#xff0c;把这个标题在网上搜一搜&#xff0c;在它下面就跟着有这样一篇文章--商人不可怕&…

vscode 1.85安装remote-ssh后左侧没有图标

vscode安装remote-ssh插件后左侧没有图标。 解决方法 想要左侧有图标&#xff0c;是另一个插件起作用&#xff1a;Remote Explorer 但是这个插件最新版需要1.87&#xff0c;可以switch to Pre-release version之后就能用了。 其实&#xff0c;最后再switch to Release Versio…

动静态库【Linux】

文章目录 静态库的打包动态库的打包 静态库的打包 把我们提供的方法&#xff0c;给别人用: 1、把源文件直接给别人 2、把源代码打包成库库.h 例如 &#xff1b;有a.c b.c c.c d.c ,四个.c文件 &#xff0c; 将a.c 形成a.o ,b.c形成b.o c.c形成c.o d.c形成d.o文件&#xff0c;…

【前端Vue3】——JQuery知识点总结(超详细)

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门知识专栏&#xff1a;&#x1f387;【MySQL&#…

【力扣刷题 动态规划】LeetCode 139 单词拆分、LeetCode 300 最长递增子序列 ✌

文章目录 1. 单词拆分2. 最长递增子序列 1. 单词拆分 题目链接 &#x1f34e; 解题思路&#xff1a; class Solution {bool dp[310] {false};public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> myset;for(auto& str :…

《欢乐钓鱼大师》新手攻略大全!新手逆袭之路!

《欢乐钓鱼大师》是一款趣味十足的模拟钓鱼游戏&#xff0c;适合各类玩家&#xff0c;从钓鱼新手到钓鱼高手都能在游戏中找到乐趣。为了帮助新手玩家更快地掌握游戏技巧&#xff0c;提高钓鱼水平&#xff0c;我们准备了一些实用的攻略和技巧&#xff0c;帮助大家轻松入门&#…

PDF 文件的解析

1、文本 PDF 的解析 1.1、文本的提取 进行文本提取的 Python 库包括&#xff1a;pdfminer.six、PyMuPDF、PyPDF2 和 pdfplumber&#xff0c;效果最好的是 PyMuPDF&#xff0c;PyMuPDF 在进行文本提取时能够最大限度地保留 PDF 的阅读顺序&#xff0c;这对于双栏 PDF 文件的抽…

MyBatis3.4全集笔记

MyBatis 1. MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Ja…

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级讲解,耐心看完)

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解 这里我先引出问题然后再来一步步进行剖析,SpringSecurity到底是如何实现引入依赖后所有请求都需要进行认证并且会弹出login登录表单页面. 接下来会对SpringBoot的自动装配进行详解,SpringSecurity也是通过自动装配…

AI绘画Stable Diffusion 制作幻术光影字:使用Brightness亮度控制模型,超简单!

大家好&#xff0c;我是灵魂画师向阳。 今天给大家分享的教程是利用AI工具Stable Diffusion 制作光影文字。这是一种通过模拟自然光线照射和阴影效果&#xff0c;使文字看起来具有立体感和逼真感的设计风格。 它的主要目的是让文字自然的融合在场景中。 先来看组实例图。 …

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 ​ 完整代码分析 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#…

【赠书活动】好书推荐—《详解51种企业应用架构模式》

导读&#xff1a; 企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f;世界著名软件开发大师Martin Fowler给你答案。 01 什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈及的模式也都是关于企业应用的。&#xff08;企业应用…

逐步掌握最佳Ai Agents框架-AutoGen 八 开源模型

前言 本篇文章&#xff0c;我们来探索下AutoGen使用其它LLM大模型。主要原因是AutoGen在使用chatgpt3.5/chatgpt 4等付费模型时&#xff0c;token开销比较大。如果我们的业务&#xff0c;社区里的开源模型就能搞定&#xff0c;那当然就开冲了。 接下来就让我们看下&#xff0…