学习设计模式《二》——外观模式
一、基础概念
1.1、外观模式的简介
外观模式的本质是【封装交互、简化调用】;
外观模式的说明:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,然后在这些方法里面实现;由外观类再去分别调用内部的多个模块来实现功能,从而让客户端变得简单;这样一来,客户端就只需要和外观类交互就可以了。
外观模式的实现:对一个子系统来说,外观类不需要很多,可以实现为一个单例; 或直接将外观类中的方法实现为静态方法,将外观类作为一个辅助工具类,方便外部直接调用 。
外观模式目的:为了让外部减少与子系统内部多个对象或模块的交互,松散耦合,封装了内部细节, 从而让外部能够更简单地使用子系统。
使用外观模式的注意点:因为外观模式是当做子系统对外的通道,虽然也可以在这里定义一些子系统没有的功能,但不建议这样做【外观应该是包装已有功能,它主要负责组合已有功能来实现客户需要,本身并不进行功能的处理,而不是添加新的实现】。
何时选用外观模式?
1、希望为一个复杂的子系统提供简单的对外通道,简化外部调用;
2、想要让外部程序和抽象类的实现部分松散耦合(使用外观类将子系统与外部客户端分离开,提供子系统的独立性与可移植性);
3、构建多层结构的系统。
序号 | 外观模式的优点 | 外观模式的缺点 |
1 | 松散耦合 (松散了客户端与子系统的耦合关系,让子系统内部模块更容易扩展与维护) | 过多或不太合理的外观类容易让人迷惑(即是调用外观类好,还是直接调用模块好) |
2 | 简单易用 (外观类让子系统更加易用,客户端不再需要了解子系统内部实现,也不需要与子系统内部模块交互) | |
3 | 更好的划分访问层次 (合理使用外观类,可以帮助我们更好地划分访问层次【外观类把需暴露给外部的功能都集中提供,而子系统内部更多的方法是内部使用】) |
1.2、现实中的一些外观模式例子
比如我们现实生活中的需要购买台式电脑:可以有两种方式:
方法一:自己列出所需的各种配件,然后买来各种配件,自己组装(这个方案是好,但是需要对各种电脑配件熟悉,这样才能选择到合适的配件,且需要考虑好各个配件间的兼容性)
方案二:直接找到专业的装机公司或团体,把自己的需求提出来,然后有装机公司根据要求购买好对于的配件组装调试好给你(这个方案是省心,但是价格会贵一些,综合起来还是比较划算的,是大多数人的选择)【该方案中的专业装机公司或团体就可以看作是外观模式的外观类了】
二、外观模式示例
在软件开发公司中会有一个为了减少大家复制粘贴工作的代码生成工具,用来生成基础的代码(比如数据库的增删查改【一般会生成三层内容(表现层、业务层、数据层)】),在项目开发中可以直接使用该工具生成基础的代码,然后可以留出更多的时间去实现项目中的业务内容;我们这里仅写一些示意代码,主要是用来展现外观模式:
2.1、常规实现
1、编写配置模型类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{/// <summary>/// 配置模型示意/// </summary>internal class ConfigModel{//是否需要生产表现层private bool needGenPresentation = true;//是否需要生成逻辑层private bool needGenBusiness=true;//是否需要生成数据层(DAO表示Data Access Object)private bool needGenDAO = true;public bool NeedGenPresentation { get => needGenPresentation; set => needGenPresentation = value; }public bool NeedGenBusiness { get => needGenBusiness; set => needGenBusiness = value; }public bool NeedGenDAO { get => needGenDAO; set => needGenDAO = value; }}//Class_end
}
2、编写配置管理类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{internal class ConfigManager{private static ConfigManager configManager = null;private static ConfigModel configModel = null;public ConfigManager(){}public static ConfigManager GetInstance() {if (configManager==null){configManager = new ConfigManager();configModel = new ConfigModel();//读取配置文件,把值设置到ConfigModel中}return configManager;}//获取配置的数据public ConfigModel GetConfigData(){return configModel;}}//Class_end
}
3、编写表现层类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{/// <summary>/// 生成表现层模块示意/// </summary>internal class Presentation{public void Generate(){//1、从配置管理里面获取相应的配置信息ConfigModel configModel=ConfigManager.GetInstance().GetConfigData();if (configModel.NeedGenPresentation){//2、按照要求生成对应的表现层代码,并保存为文件Console.WriteLine("正在生成表现层代码文件并保存");}}}//Class_end
}
4、编写业务层类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{/// <summary>/// 生产逻辑层模块示意/// </summary>internal class Business{public void Generate(){ConfigModel configModel = ConfigManager.GetInstance().GetConfigData();if (configModel.NeedGenBusiness){Console.WriteLine("正在生成逻辑层的代码文件并保存");}}}//Class_end
}
5、编写数据层类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{/// <summary>/// 生成数据层模块示意/// </summary>internal class DAO{public void Generate(){ConfigModel configModel=ConfigManager.GetInstance().GetConfigData();if (configModel.NeedGenDAO){Console.WriteLine("正在生成数据层的代码文件并保存");}}}//Class_end
}
6、编写客户端实现,需要客户端对接各个类进行了解调用组合
客户端为了使用生成代码的功能,需要与生成代码子系统内部的多个模块进行交互【对客户端来说,这是比较麻烦的,且如果其中的某个模块发生了变化,还可能引起客户端要随着变化】
using FacadePattern.CodeGenerationV1;namespace FacadePattern
{internal class Program{static void Main(string[] args){Console.WriteLine("客户端要实现功能需自己管理不同的子模块与逻辑");/**** 目前没有配置文件,直接使用默认配置(生成三层模块)* 也就是说客户端必须要对这三个模块都有所了解,才能够正确使用;* 且客户端为了使用生成代码的功能,需要与生成代码子系统内部的多个模块进行交互* 【对客户端来说,这是比较麻烦的,且如果其中的某个模块发生了变化,还可能引起客户端要随着变化】* (如何实现?才能让子系统外部的客户端在使用子系统的时候简单的使用子系统内部模块功能,而又不用与子系统内部的多个模块交互?)* ***/new Presentation().Generate();new Business().Generate();new DAO().Generate();}//Class_end}
}
运行后的结果如下:
2.2、外观模式
如何实现?才能让子系统外部的客户端在使用子系统的时候简单的使用子系统内部模块功能,而又不用与子系统内部的多个模块交互?
1、单独创建一个外观类用来调用组合子系统的功能
/***
* Title:"设计模式" 项目
* 主题:外观模式
* Description:
* 基础概念:本质是【封装交互、简化调用】
* 外观模式:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,
* 然后在这些方法里面实现;由外观类再去分别调用内部的多个模块来实现功能,
* 从而让客户端变得简单;这样一来,客户端就只需要和外观类交互就可以了。
*
* 外观模式目的:为了让外部减少与子系统内部多个对象或模块的交互,松散耦合,封装了内部细节,
* 从而让外部能够更简单地使用子系统
*
* 使用外观模式的注意点:因为外观模式是当做子系统对外的通道,虽然也可以在这里定义一些子系统
* 没有的功能,但不建议这样做【外观应该是包装已有功能,它主要负责组合已有
* 功能来实现客户需要,本身并不进行功能的处理,而不是添加新的实现】
*
* 外观模式的实现:对一个子系统来说,外观类不需要很多,可以实现为一个单例
* 或直接将外观类中的方法实现为静态方法,将外观类作为一个辅助工具类,方便外部直接调用
*
* 有外观模式,但可以不使用:虽然有外观类,但如果有需要,外部还是可以绕开外观类,而直接调用
* 某个具体模块功能,这样就能实现兼顾组合功能和细节功能
*
* 外观模式优点:
* 松散耦合(松散了客户端与子系统的耦合关系,让子系统内部模块更容易扩展与维护)
* 简单易用(外观类让子系统更加易用,客户端不再需要了解子系统内部实现,也不需要与子系统内部模块交互)
* 更好的划分访问层次(合理使用外观类,可以帮助我们更好地划分访问层次【外观类把需暴露给外部的功能都集中提供,而子系统内部更多的方法是内部使用】)
* 外观模式缺点:过多或不太合理的外观类容易让人迷惑(即是调用外观类好,还是直接调用模块好)
*
* 何时选用外观模式?
* 1、希望为一个复杂的子系统提供简单的对外通道,简化外部调用;
* 2、想要让外部程序和抽象类的实现部分松散耦合(使用外观类将子系统与外部客户端分离开,提供子系统的独立性与可移植性)
* 3、构建多层结构的系统
*
* Date:2025
* Version:0.1版本
* Author:Coffee
* Modify Recoder:***/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FacadePattern.CodeGenerationV1
{/// <summary>/// 定义一个子系统的外观对象,统一对外提供方法,外部不用关心与管理内部模块的实现/// </summary>internal class Facade{private Facade(){}/// <summary>/// 直接把客户端需要的功能单独定义一个方法提供出来/// </summary>public static void Generate(){//该方法实现的时候,可能会调用到内部的多个模块new Presentation().Generate();new Business().Generate();new DAO().Generate();}}//Class_end
}
2、客户端可以直接调用外观类的方法(简单明了,客户端不用了解子系统的各个模块与细节)
using FacadePattern.CodeGenerationV1;namespace FacadePattern
{internal class Program{static void Main(string[] args){Console.WriteLine("外观模式");//客户端直接调用外观对象的方法(简单便捷)Facade.Generate();Console.ReadLine();}//Class_end}
}
运行结果如下:
三、项目源码工程
kafeiweimei/Learning_DesignPattern: 这是一个关于C#语言编写的基础设计模式项目工程,方便学习理解常见的26种设计模式https://github.com/kafeiweimei/Learning_DesignPattern
相关文章:
学习设计模式《二》——外观模式
一、基础概念 1.1、外观模式的简介 外观模式的本质是【封装交互、简化调用】; 外观模式的说明:就是通过引入一个外观类,在这个类里面定义客户端想要的简单方法,然后在这些方法里面实现;由外观类再去分别调用内部的多个…...
python中,处理多分类时,模型之间的参数设置
在Python的机器学习库中,处理多分类问题时,不同的模型可能会有不同的参数设置来适应多分类场景。这里列举几个常见模型及相关的多分类参数: 1. Logistic Regression (逻辑回归) 在Scikit-Learn库中,逻辑回归模型可以通过设置mul…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(四级)真题
青少年软件编程(Python)等级考试试卷(四级) 分数:100 题数:38 答案解析:https://blog.csdn.net/qq_33897084/article/details/147341407 一、单选题(共25题,共50分) 1. 下列程序段…...
蓝桥杯12. 日期问题
日期问题 原题目链接 题目描述 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日 之间。 令小明头疼的是,这些日期采用的格式非常不统一: 有的采用 年/月/日有的采用 月…...
【MATLAB代码例程】AOA与TOA结合的高精度平面地位,适用于四个基站的情况,附完整的代码
本代码实现了一种基于到达角(AOA) 和到达时间(TOA) 的混合定位算法,适用于二维平面内移动或静止目标的定位。通过4个基站的协同测量,结合最小二乘法和几何解算,能够有效估计目标位置,并支持噪声模拟、误差分析和可视化输出。适用于室内定位、无人机导航、工业监测等场景…...
ARINC818协议(五)
1.R_CTL,设置固定的0x44即可 2.Dest_ID:目的地D_ID,如果不需要目的地址,就设置为0;ADVB协议支持 多个视频目的地址,广播通信; 3.cs_ctl在FC-AV上不用 4.source_ID:S_ID [23:0]包含源实体的端口的地址标识;不用就设置为0. ADVB允许…...
国产品牌芯洲科技100V降压芯片系列
SCT2A25采用带集成环路补偿的恒导通时间(COT)模式控制,大大简化了转换器的片外配置。SCT2A25具有典型的140uA低静态电流,采用脉冲频率调制(PFM)模式,它使转换器在轻载或空载条件下实现高转换效率。 芯洲科技100V降压芯片系列提供丰富的48V系…...
遨游科普:三防平板除了三防特性?还能实现什么功能?
在工业4.0浪潮席卷全球的今天,电子设备的功能边界正经历着革命性突破。三防平板电脑作为"危、急、特"场景的智能终端代表,其价值早已超越防水、防尘、防摔的基础防护属性。遨游通讯通过系统级技术创新,将三防平板打造为集通信中枢、…...
边缘计算网关组态功能的定义
边缘计算网关组态功能的定义 边缘计算网关组态是指根据特定的应用场景和需求,对边缘计算网关进行配置和定制的过程。它涵盖了硬件接口的选择、软件功能的设定、通信协议的配置以及数据处理流程的设计等多个方面,旨在使网关设备更加贴合实际应用场景&…...
数据可视化笔记:柱状图
数据可视化笔记:柱状图与饼图 1.1 一、基础配置 在进行数据可视化之前,需要对Matplotlib进行一些基础配置,以确保图表能够正确显示中文以及设置合适的分辨率和大小。 from matplotlib import pyplot as plt import numpy as np# 设置中文字…...
珈和科技:无人机技术赋能智慧农业,精准施肥与病虫害监控全面升级
无人机技术在农业领域的兴起,是现代技术发展为传统农业带来的重要变革。目前, 无人机已成为农业生产中不可或缺的关键工具,在提高粮食产量、改善土壤健康和保护生态环境等方面提供了新的解决方案。珈和科技从无人机的类型、特点和监测系统入手…...
UR5e机器人动力学
机器人动力学研究力与运动之间的关系,核心目标是建立关节力矩与关节位置、速度、加速度的数学关系。动力学模型通常分为: 正向动力学:已知关节力矩,计算末端执行器的运动(加速度)。 逆向动力学:已知期望的运动(位置、速度、加速度),计算所需的关节力矩。 https://www…...
【go】什么是Go语言的GPM模型?工作流程?为什么Go语言中的GMP模型需要有P?
Go语言GMP调度模型详解 一、GMP模型核心概念 Go语言的GMP模型是一种高效的轻量级线程管理调度系统,由三个核心组件构成: G (Goroutine): 轻量级协程,初始栈仅2KB(可动态扩容)用户态调度,创建成…...
X-AnyLabeling开源程序借助 Segment Anything 和其他出色模型的 AI 支持轻松进行数据标记。
一、软件介绍 文末提供源码和程序下载学习 使用 X-AnyLabeling开源程序可以 导入、管理和保存数据。用户可以通过多种方式导入图像和视频文件,包括快捷方式或菜单选项。此外,它还涵盖数据删除、图像切换以及标签和图像数据的保存,以确保高效…...
简易 Python 爬虫实现,10min可完成带效果源码
目录 准备工作 编写爬虫代码 运行爬虫 查看结果 遇到的问题及解决 总结 前言和效果 本文记录了使用 Python 实现一个简单网页爬虫的过程,目标是爬取 quotes.toscrape.com 的名言和作者,并将结果保存到文本文件。以下是完整步骤,包含环境…...
全志H5,NanopiKP1lus移植QT5.12记录
移植步骤 机器环境下载QT5.12.0源码安装交叉编译器修改qmake.conf文件配置编译选项qt5的configure选项说明基本配置选项编译器和链接器选项功能模块配置第三方库集成注意事项 配置过程报错解决配置完成编译过程报错解决编译完成将arm-qt文件夹传送到开发板配置板子环境变量运行…...
Spring Boot 依赖注入与Bean管理:JavaConfig如何取代XML?
大家好呀!今天我们来聊一个超级实用的技术话题 —— Spring Boot 中的依赖注入和Bean管理,特别是JavaConfig是如何一步步取代XML配置的。我知道很多小伙伴一听到"依赖注入"、"Bean管理"这些词就头大,别担心!我…...
AUTOSAR图解==>AUTOSAR_SWS_E2ETransformer
AUTOSAR E2E Transformer详解 基于AUTOSAR标准的端到端通信保护变换器技术解析 目录 1. E2E Transformer概述 1.1 E2E Transformer的作用1.2 功能特点1.3 应用场景限制 2. 模块架构 2.1 架构设计2.2 与其他模块的关系 3. 初始化与状态机 3.1 模块状态流转3.2 初始化与去初始化…...
从Archery到NineData:积加科技驱动数据库研发效能与数据安全双升级
积加科技作为国内领先的企业级数字化解决方案服务商,依托自研的 A4X 数字化平台(https://a4x.io/),专注于为全球范围内的视觉物联网(IoT)设备提供 PaaS/SaaS 服务。致力于运用 AI 技术赋能物联网世界的各类…...
hadoop和Yarn的基本介绍
Hadoop的三大结构及各自作用? Hadoop是一个由Apache基金会开发的分布式系统基础架构,主要用于处理大规模数据集的分布式存储和计算。Hadoop的三大核心结构是HDFS(Hadoop Distributed File System)、MapReduce和YARN(Y…...
神经接口安全攻防:从技术漏洞到伦理挑战
随着脑机接口(BCI)技术的快速发展,神经接口设备已从实验室走向消费市场。然而,2025年曝光的某品牌脑机接口设备漏洞(CVE-2025-3278)引发了行业对神经数据安全的深度反思。本文围绕神经接口安全的核心矛盾&a…...
云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》
2025年4月8日至9日,中国人工智能产业发展联盟(以下简称AIIA)第十四次全体会议暨人工智能赋能新型工业化深度行(南京站)在南京召开。工业和信息化部科技司副司长杜广达,中国信息通信研究院院长、中国人工智能…...
SpringBoot项目异常处理
一、异常问题描述 进行添加员工测试的时候,服务端报错, 报错信息如下: java.sql.SQLIntegrityConstraintViolationException:主要就是因为在 employee 表结构中,我们针对于username字段,建立了唯一索引,添…...
机器学习05-CNN
CNN(卷积神经网络)学习文档 一、引言 卷积神经网络(Convolutional Neural Network,CNN)是深度学习中的一种重要网络结构,在图像识别、计算机视觉等领域取得了巨大成功。CNN 的设计灵感来源于生物视觉系统…...
Java Web 之 Servlet 100问
Filter 是什么? 在Java Web开发中,Filter(过滤器)是一种用于在请求到达目标资源(如Servlet、JSP)之前或响应返回客户端之前进行预处理和后处理的组件。Filter可以拦截请求和响应,执行特定的操作…...
z-library电子图书馆最新地址的查询方法
对于喜欢读书的伙伴们,应该都听说过z站(z-library),优点多多,缺点就是地址不稳定,经常会变化网站地址。然后我最近发现了一个工具,可以不间断更新官方可用的z站地址:电子书最新地址...
PyCharm入门导览
一、项目视图 项目视图位置如下所示: 项目视图是主要工具窗口之一。它包含项目目录、SDK特定的外部库和临时文件。点击带条纹的按 钮可以预览演示项目。也可以按Alt 1 打开。 二、Python解释器 点击右下角项目的名字,可以快速进入【Python解释器】界面…...
算法题(127):最大子段和
审题: 本题需要我们找到n个整数中连续且非空的最大子段和 思路: 方法一:前缀和 我们的思路是将每个索引位置的最大子段和求出,然后用answer进行max维护,最后输出answer即可 最大子段和怎么求? 子段和 f[i]…...
物联网分层架构全解析:从感知到应用的智能生态构建
物联网分层架构一般可细分为感知层、网络层、平台层和应用层,以下是各层更详细的介绍: 一、感知层 1.功能 数据采集:利用各类传感器对物理世界的各种信息进行采集,包括环境参数(如温度、湿度、光照、气压等…...
系统架构师2025年论文通用模板
搭建自己的模板 1、项目选择与实施建议整理 一、项目选择标准 金额与周期要求:优先选择金额在 200万以上 的中大型商业项目,研发周期建议 不少于8个月。避免选择小型项目(如金额低于100万、周期短于1年)。 …...
Flink 2.0 编译
文章目录 Flink 2.0 编译第一个问题 java 版本太低maven 版本太低maven 版本太高开始编译扩展多版本jdk 配置 Flink 2.0 编译 看到Flink2.0 出来了,想去玩玩,看看怎么样,当然第一件事,就是编译代码,但是没想到这么多问…...
Java线程的几种状态
线程状态我们在此介绍六种线程状态 1.NEW 2.RUNNABLE 3.TIMED_WAITING 4.BLOCKED 5.WAITING 6.TERMINATED 1.初始状态 (NEW) 当一个线程对象被创建但尚未调用 start() 方法时,线程处于初始状态。此时,线程还没有开始执行。 通俗的讲就是安排了工作但是…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(一级)真题
青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 答案解析:https://blog.csdn.net/qq_33897084/article/details/147335019?spm1001.2014.3001.5501 一、单选题(共25题࿰…...
「数据可视化 D3系列」入门第十章:饼图绘制详解与实现
饼图绘制详解与实现 一、饼图绘制核心知识1. d3.arc() 弧形生成器2. d3.pie() 布局函数3. arc.centroid() 中心点计算4. 颜色方案 二、饼图实现代码小结核心知识点下章预告:力导向图 一、饼图绘制核心知识 1. d3.arc() 弧形生成器 功能: 生成圆形、扇形…...
三维点拟合平面ransac c++
理论 平面的一般定义 在三维空间中,一个平面可以由两个要素唯一确定: 法向量 n(a,b,c):垂直于平面的方向 平面上一点 平面上任意一点 p(x,y,z) 满足: ( p − p 0 ) ∗ n 0 (p - p0) * n 0 (p−p0)∗n0 即 a ( x − x 0 ) …...
第六章:6.6输入以下的杨辉三角形,要求输出10行
//输入以下的杨辉三角形,要求输出10行 #include<stdio.h> int main() {int a[10][10] { 0 };int i 0, j 0;for (i 0; i < 10; i){for (j 0; j < 10; j){if (j 0){a[i][j] 1;}else if (i j){a[i][j] 1;}else{a[i][j] a[i - 1][j - 1] a[i - …...
初识Redis · C++客户端string
目录 前言: string的API使用 set get: expire: NX XX: mset,mget: getrange setrange: incr decr 前言: 在前文,我们已经学习了Redis的定制化客户端怎么来的,以及如何配置好Redis定制化客户端&…...
React 事件处理基础
React 中最常见的两个需求,一个是列表渲染,另一个就是绑定点击事件。 这一篇就是从最基础的按钮点击开始,分四个阶段,逐步理解 React 中事件的写法和参数传递方式。 📍阶段一:最简单的点击事件 function A…...
插入排序和希尔排序
今天给小伙伴们分享两个比较基础的排序算法,插入排序和希尔排序,这两个排序算法之间联系还是挺多的,所以放在一起。希尔排序可以看作是插入排序的升级版,在面对一些更为复杂的场景时,希尔排序的效率往往要比插入排序高…...
Model Context Protocol (MCP) 开放协议对医疗多模态数据整合的分析路径【附代码】
Model Context Protocol (MCP) 作为一种革命性的开放协议,正在重塑医疗领域多模态数据整合的方式。本文将深入分析MCP协议在医疗多模态数据整合中的具体路径、技术实现、应用场景及未来发展方向,揭示这一协议如何成为连接AI与医疗数据的关键桥梁。 MCP协议概述及其在医疗多模…...
Oracle 11g通过dg4odbc配置dblink连接PostgreSQL
1、安装unixodbc 2、安装postgresql yum install -y postgresql17-odbc 3、配置postgresqlodbc数据源 vim /usr/local/etc/odbcinst.ini##添加如下 [mypg] Driver /usr/lib64/psqlodbcw.so Servername localhost Port 5432 Database postgres Username postgres Pas…...
docker 安装prometheus普罗米修斯
prometheus(普罗米修斯):天生为采集存储监控数据而生的时序数据库。prometheus通过各种Exporter采集到监控数据,然后存储进prometheus中,以供查询展示 grafana:一个监控仪表系统。grafana的数据来源可以有…...
Ubuntu上安装Mysql
步骤 1:安装 MySQL Server sudo apt update sudo apt install mysql-server -y这将安装最新版本的 MySQL 8.0 以及所有依赖组件。 步骤 2:检查安装是否成功 mysql --version sudo systemctl status mysql如果状态是 active (running),说明成…...
Spring Boot启动流程深度解析:从main()到应用就绪的完整旅程
🌱 Spring Boot启动流程深度解析:从main()到应用就绪的完整旅程 #SpringBoot核心 #启动原理 #自动配置 #源码解析 一、启动流程图解 (1) 启动类执行 → (2) SpringApplication初始化 → (3) 事件驱动模型启动 ↓ …...
2025TGCTF Web WP复现
AAA 偷渡阴平 <?php$tgctf2025$_GET[tgctf2025];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){//hint:你可以对着键盘…...
交叉注意力层的实质作用:连接编码器和解码器
交叉注意力层的实质作用 在Transformer架构里,交叉注意力层主要作用是连接编码器和解码器,让解码器能够利用编码器输出的上下文信息 。具体来说: 聚焦相关信息:以机器翻译任务为例,在将源语言句子翻译成目标语言时,交叉注意力能使解码器生成的每个词,都聚焦于源语言序列…...
conversation_template | conversation_actors | conversation_line_template
目录 conversation_template conversation_actors conversation_line_template 实例应用 conversation_template id:某段谈话的唯一编号FirstLineId:谈话开始的第一段话的编号,取值来源 ConversationLine.db2 的 ID 字段TextureKitId&am…...
C++ `shared_ptr` 多线程使用
C shared_ptr 多线程使用 一、核心结论 引用计数:shared_ptr 的引用计数操作是原子的,线程安全控制块修改:修改 shared_ptr 指向的对象需要同步被管理对象:若对象本身非线程安全,访问时仍需加锁 二、分场景详解 场景…...
十天借助 Trae 实现 “幸运塔塔屋” 小程序时光记忆功能之旅
在软件开发的广阔天地中,创新与效率始终是开发者们不懈追求的目标。近期,我成功完成了一次极具挑战性与创新性的实践 —— 仅用十天时间,借助 Trae 这款强大的 AI 工具,开发出了 “幸运塔塔屋” 小程序,其中的 “时光记…...
WiFi“管家”------hostapd的工作流程
目录 1. 启动与初始化 1.1 解析命令行参数 1.2 读取配置文件 1.3 创建接口和 BSS 数据结构 1.4 初始化驱动程序 2. 认证和关联处理 2.1 监听认证请求 2.2 处理认证请求 2.3 处理关联请求 3. 数据转发 3.1 接收客户端数据 3.2 转发数据 4. 断开连接处理 4.1 处理客…...