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

news2024/10/4 21:08:26

👈️上一篇:桥接模式

设计模式-专栏👈️

目 录

  • 外观模式(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.coloradmin.cn/o/1711621.html

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

相关文章

STM32H750外设之ADC连续转换模式

目录 概述 1 ADC数据转换模式介绍 1.1 功能介绍 1.2 ADCx_CFGR 2 连续转换模式 (CONT1) 2.1 功能介绍 2.2 连续转换模式 2.3 转换序列完成 3 注意问题 概述 本文主要介绍STM32H750外设之ADC连续转换模式的相关内容&#xff0c;包括与之相关的寄存器的控制位bit。每个…

详解makefile中的foreach

在 Makefile 中&#xff0c;foreach 函数用于迭代处理一个以空格分隔的列表&#xff0c;并针对列表中的每个元素执行相同的操作。这个函数通常用于循环处理一组变量或文件名&#xff0c;并执行相同的规则或命令。 语法&#xff1a; makefile Copy Code $(foreach var, list, …

四川古力未来科技抖音小店安全靠谱,购物新体验

在数字化浪潮席卷而来的今天&#xff0c;电商行业蓬勃发展&#xff0c;各种线上购物平台如雨后春笋般涌现。其中&#xff0c;抖音小店凭借其独特的短视频直播购物模式&#xff0c;迅速赢得了广大消费者的青睐。而四川古力未来科技抖音小店&#xff0c;更是以其安全靠谱、品质保…

单点11.2.0.3备份恢复到单点11.2.0.4

保命法则&#xff1a;先备份再操作&#xff0c;磁盘空间紧张无法备份就让满足&#xff0c;给自己留退路。 场景说明&#xff1a; 1.本文档的环境为同平台、不同版本&#xff08;操作系统版本可以不同&#xff0c;数据库小版本不同&#xff09;&#xff0c;源机器和目标机器部…

广东省保健食品行业协会批复成为“世界酒中国菜”活动指导单位

广东省保健食品行业协会正式批复成为“世界酒中国菜”系列活动指导单位&#xff0c;共促餐饮文化交流发展 近日&#xff0c;广东省保健食品行业协会正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位…

【Linux】初识Linux和Linux环境配置

1.什么是Linux操作系统 说到电脑系统 我想有大多数人会脱口而出&#xff1a;windows、mac 是的&#xff0c;这也是如今市场上主流的两种操作系统。 但是对于IT相关的人士来说&#xff0c;还有一种系统也是必须有姓名 那就是Linux Linux&#xff0c;Linux Is Not UniX 的…

Python Hydra:现代开发者的配置管理神器

更多Python学习内容&#xff1a;ipengtao.com Hydra是一个用于配置管理的强大工具&#xff0c;旨在帮助开发者处理复杂的应用程序配置。它支持多层次的配置合并、命令行覆盖、动态配置和实验管理。Hydra特别适用于需要处理大量配置参数的机器学习和深度学习项目。本文将详细介绍…

《公正》孙溟㠭艺术

孙溟㠭艺术《公正》 孙溟㠭艺术《公正》

​一款开源的.NET程序集反编译、编辑和调试神器

前言 说到.NET相关的反编译工具大家脑海里第一个想到的工具是什么&#xff1f;ILSpy、dnSpy、还是dotPeek&#xff1f;咱们今天的主要内容是讲讲dnSpyEx&#xff08;dnSpyEx是dnSpy项目的非官方Fork维护版本&#xff09;这个开源的.NET程序集反编译、编辑和调试工具该如何使用…

RT-DETR算法改进【NO.1】借鉴CVPR2024中的StarNet网络StarBlock改进算法

前 言 YOLO算法改进的路有点拥挤,尝试选择其他的baseline作为算法研究,可能会更加好发一些文章。后面将陆续介绍RT-DETR算法改进的方法思路。 很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解…

温度传感器安装热套管介绍

热套管&#xff08;Thermowell&#xff09;是一段末端封闭的金属管&#xff0c;主要通过焊接、螺纹或法兰连接的方式安装到过程容器或管线上&#xff0c;可保护温度传感器免受流致应力、高压和腐蚀性化学品等严苛工况的影响。此外&#xff0c;热套管使传感器可以轻松方便地拆下…

让 AI 回答更精准 来学学这些Prompt入门小技巧

&#x1f3a5;前言 最近一直在研究各种 AI 提问相关的方法&#xff0c;一顿输入后&#xff0c;get到了好多有趣又好玩的提问小技巧。今天就来和小伙伴们安利下&#xff0c;平常在向AI提问时&#xff0c;最最基础&#xff0c;且最最实用的6种提示词方法。 那废话不多说&#x…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第二周) - 多类别分类和神经网络

多类别分类和神经网络 1. 多类别分类2. 多类别感知机和多类别逻辑回归3. 多类别分类的场景4. 分类公平性5. 神经网络6. 神经网络可视化7. 神经网络的前向传播和反向传播8. 神经网络的训练与优化 1. 多类别分类 分类是一个预测建模问题&#xff0c;它涉及到在给定输入的情况下…

8.2 数组遍历访问

本节必须掌握的知识点&#xff1a; 示例三十 代码分析 汇编解析 在上一节中介绍了数组相关的概念&#xff0c;而在本节中将介绍数组的使用。 8.2.1 示例三十 ■访问数组 示例代码三十 ●第一步&#xff1a;分析需求&#xff0c;设计程序…

【C语言习题】26.字符逆序

文章目录 1.描述2.解题思路3.具体代码 1.描述 输入描述: 将一个字符串str的内容颠倒过来&#xff0c;并输出。可以有空格 数据范围&#xff1a;1≤&#x1d459;&#x1d452;&#x1d45b;(&#x1d460;&#x1d461;&#x1d45f;)≤10000 1≤len(str)≤10000 输出描述&…

httpJVM

目录 HTTPS如何保证安全 1&#xff09;引入非对称加密 2&#xff09;引入非对称加密 3.中间人攻击 4.解决中间人攻击 JVM 1.JVM内存划分 2.JVM类加载过程 八股内容 3.JVM中的垃圾回收机制 释放垃圾的策略 1.标记-清除 2.复制算法 3.标记-整理 分代回收 HTTPS如何…

基于JCEF实现网页资源性能分析

文章目录 1、需求2、实现代码3、运行效果 1、需求 在使用chrome浏览器访问页面时&#xff0c;浏览器自带的开发者工具可以查看页面每个资源的资源大小和加载时间。 这个功能可以让我们直接知道接口或资源的耗时情况和大小情况&#xff0c;如果存在性能问题&#xff0c;可以进…

AST反混淆|对一段非常复杂的混淆代码深度剖析与还原

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1.代码片段 ((((ld0 ((ld1 (ld1 Uint8Array) && undefined…

云计算-Lambda事件 (Lambda Events)

检索事件信息 (Retrieving Event Information) 在上一个主题中&#xff0c;我们已经看到了如何创建一个Lambda函数、添加handler、添加触发器和配置执行策略。在本主题中&#xff0c;我们将对其进行扩展。到目前为止&#xff0c;我们看到的handler应用非常简单&#xff0c;但我…

uniapp一些问题解决

1.按钮边框如何去除&#xff1f; 参考博主&#xff1a;微信小程序按钮去不掉边框_微信小程序button去掉边框-CSDN博客文章浏览阅读1k次。最近在学uni-app&#xff0c;顺便自己写个小程序。左上角放了个button&#xff0c;可边框怎么也去不掉…原来微信小程序的按钮要去掉边框要…