探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
设计模式专栏:http://t.csdnimg.cn/U54zu
目录
引言:探索简化之路
一、起源和演变
二、场景案例分析
2.1 不用模式实现:用一坨坨代码实现
2.2 问题
2.3 外观模式重构代码
定义
界面
接口
利用外观模式解决问题步骤
外观模式结构和说明
重构代码(结构图)
三、外观模式的核心概念(模式讲解)
3.1 定义
3.2 外观模式的目的
3.3 外观模式的本质原理
3.4 关键问题思考
3.5 外观模式的双刃剑效应
优点(利)
缺点(弊)
四、外观模式的最佳实践和常见误区
4.1 实现外观模式的步骤与技巧
实现步骤:
技巧:
4.3 挑战与陷阱
过度封装导致的灵活性降低
难以适应快速变化的需求
可能导致过度依赖
4.3 如何应对这些挑战
五、外观模式与相似模式的比较
5.1 外观模式 (Facade)
5.2 中介者模式 (Mediator)
5.3 适配器模式 (Adapter)
六、掌握外观模式的未来
6.1 预测与趋势
6.2 持续发展
结语:简化之美
外观模式的核心价值
外观模式在软件开发中的重要性
引言:探索简化之路
在软件开发领域,复杂性如同难以驯服的野兽,让无数开发者望而却步。你是否想过,为何复杂性总是软件开发中的常青藤?我们又如何在这样的挑战中优雅地应对呢?答案就在于今天我们将要介绍的“外观模式”。 |
在软件开发中,有一个隐形守护者,它让复杂系统变得亲民,使开发者能够轻松地管理代码。这个守护者就是我们所说的“外观模式”。但“外观模式”究竟是什么呢?为什么它会有如此神奇的力量? |
今天,我们将深入探索外观模式的核心思想,带你一探究竟。通过了解和掌握外观模式,你将会发现如何让复杂系统变得简单易用,如何让代码更加优雅、更加高效。让我们一起揭开外观模式的神秘面纱,迎接更加美好的编程未来!
一、起源和演变
据认为,外观模式作为一种正式的设计模式,是在1994年由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四人—通常被称作“四人帮(Gang of Four,GoF)”在其著名的书籍《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)中首次被正式介绍和命名的。该书归纳总结了23种设计模式,影响了随后几十年的软件开发实践。 自那时起,外观模式被广泛地应用在不同规模和不同类型的软件系统中,以管理复杂性,提高代码可读性和可维护性。随着时间的推移和技术的发展,外观模式也不断地被改进和优化以适应不同的应用场景。 在面向对象编程以外的领域,外观模式的思想也被借鉴和应用,比如在组件接口设计、API门户、微服务架构等,都可以看到外观模式为简化复杂交互提供统一简单接口的影子。随着系统变得越来越分布式和服务化,尤其是在微服务架构流行的今天,外观模式的理念再次被强调,例如通过API网关来作为微服务的外观,为客户端提供简单的接口,从而隐藏了后端服务之间的复杂性。 |
二、场景案例分析
案例场景
软件公司需要开发一个文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中。具体流程包括读取源文件、加密、保存加密之后的文件。其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。 |
案例分析
在这个案例中,文件加密模块是一个子系统,它由三个相对独立的操作组成:读取文件、加密和保存文件。为了简化客户端与子系统之间的交互,我们可以使用外观模式来设计这个模块。 |
2.1 不用模式实现:用一坨坨代码实现
读取文件
public class SubSystemOne { // java public void read() { return "读取文件"; } } |
加密文件
public class SubSystemTwo { // java public void encrypt() { System.out.println("加密文件"); } } |
保存文件
public class SubSystemThree { // java public void save() { System.out.println("保存文件"); } } |
客户端
public class Client { // java public static void main(String[] args) { new SubSystemOne().read(); new SubSystemTwo().encrypt(); new SubSystemThree().save(); } } |
运行结果如下:
读文件 |
2.2 问题
看上面示例,实现了功能,很简单。仔细查看实现会发现其中有个问题:那就是客户端为了使用生成代码的功能,需要与生成代码子系统内部的多个模块交互。 这对于客户端而言,是个麻烦,使得客户端不能简单地使用生成代码的功能。而且,如果其中的某个模块发生了变化,还可能会引起客户端也要随着变化。 |
痛点:如何实现,才能让子系统外部的客户端在使用子系统的时候,既能简单地使用这些子系统内部的模块功能,而又不用客户端去与子系统内部的多个模块交互呢?
2.3 外观模式重构代码
用来解决上述问题的 一个合理的解决方案就是外观模式。
定义
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口, 这个接口使得这一子系统更加容易使用。 |
界面
指的是从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界 面,也就是所说的外观。 |
接口
指的是外部和内部交互的这么一个通道,通常是指一些方法,可以是类的方法,也可以是interface 的方法。也就是说,这里所说的接口,并不等价于interface,也有可能是一个类。 |
利用外观模式解决问题步骤
利用外观模式来解决问题的思路通常遵循以下步骤: 1. 识别复杂子系统:
2. 设计外观接口:
3. 实现外观:
4. 转发请求:
5. 简化客户端交互:
6. 重构和封装:
利用外观模式解决问题侧重于为系统的复杂部分提供一个统一、简化的方式来降低整体复杂度。这就允许开发者集中精力于业务逻辑,而不是低层次的、细节性的问题上。通过这种方式,当内部系统的某些部分需要更换或升级时,外观模式有助于限制变化的影响范围,提高系统的可维护性和可扩展性。 |
外观模式结构和说明
外观模式主要由以下几个部分组成: 1. 外观(Facade):
2. 复杂子系统(Complex Subsystem):
3. 客户端(Client):
4. 子系统类(Subsystem Classes):
外观模式的组成部分之间的交互通常如下:
这种模式可以极大地减少系统的复杂性,使得客户端不需要理解和处理子系统中不同组件的详细情况,而只需与外观类进行交互。外观模式也有助于代码的重构和维护,因为大多数依赖于子系统的代码都集中在外观中,从而降低了修改子系统导致的风险和成本。 |
重构代码(结构图)
添加一个Facade类
public class Facade { public void handle() { new SubSystemOne().read(); new SubSystemTwo().encrypt(); new SubSystemThree().save(); } } |
客户端
public class Client { public static void main(String[] args) { new Facade().handle(); } } |
运行结果如下:
读文件 |
如同上面讲述的例子,Facade 类其实相当于子系统123的外观界面,Facade 类也被称为子系统123对外的接口,有了这个Facade 类,那么客户端就不需要知道系统内部的实现细节,甚至客户端都不需要知道子系统123的存在,客户端只需要跟Facade类交互就好了,从而更好地实现了客户端和子系统123的解耦,让客户端更容易地使用系统。 |
三、外观模式的核心概念(模式讲解)
3.1 定义
外观模式(Facade Pattern)是一种设计模式,它通过创建一个统一的高层接口,使得复杂的子系统更加容易使用。这个模式为复杂的系统提供一个简化的接口,隐藏系统的复杂性,并使得客户端代码与子系统之间的交互更加容易进行。 外观模式又称为“门面模式”,它是一种对象结构型模式。在外观模式中,通常会引入一个外观类(Facade class),它包含了对子系统中一个或者多个接口的调用。客户端代码只需要与外观对象交互,而不必担心子系统的具体细节。这可以大大降低复杂系统的使用难度,并且在修改子系统的时候可以减少代码的改动范围,因为客户端代码依赖的通常只是外观接口,而非子系统的多个复杂接口。 |
3.2 外观模式的目的
外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。 |
从实现来看,好像是把客户端的代码移到了Facade里,其实因为Facade的出现使得整个设计已经发生了质的变化。
因为Facade的出现,Facade这个关键角色,提供了一个统一的接口到一个复杂的子系统或多个复杂的类、模块、库或框架。Facade的作用有着多个层面: 1. 简化接口:
2. 降低耦合:
3. 提升灵活性:
4. 提供抽象层:
5. 集中控制:
6. 保持子系统独立性:
Facade在设计模式中扮演着“中介”的角色。它通过为复杂的子系统提供一个简化的接口来减少系统的复杂性,保护客户端不受复杂子系统的影响,并使子系统的使用变得更加容易和直观。 |
3.3 外观模式的本质原理
外观模式的基本原理是封装复杂性并提供一个简单的接口。它建立在以下几个核心思想之上: 1. 简化接口:
2. 聚合功能:
3. 隔离和封装:
4. 单一职责原则:
5. 松耦合:
再举例来说,如果我们设想一个复杂的音频视频处理库,直接使用可能会涉及到调用多个不同的类和方法。为了简化客户端的使用,我们可以设计一个外观类,它提供了简单的 |
3.4 关键问题思考
在使用外观模式(Facade Pattern)时,有几个关键的问题需要仔细思考以确保设计的有效性和灵活性: 1. 系统的复杂性:
2. 子系统的独立性:
3. 接口的抽象程度:
4. 性能考量:
5. 耦合性问题:
6. 变更管理:
7. 可测试性:
8. 适应未来变化:
通过考虑这些问题,设计一个外观模式可以帮助你创建一个既简洁又具有足够灵活性以适应未来变化的系统。 |
3.5 外观模式的双刃剑效应
优点(利)
1. 简化接口:
2. 解耦:
3. 可维护性:
4. 易于使用和实现:
|
缺点(弊)
1. 隐藏复杂性:
2. 过度简化:
3. 难以继承扩展:
4. 单一职责原则冲突:
|
在实际应用中,开发者需要衡量在特定情况下使用外观模式的利弊,从而做出合理的设计选择。例如,在一个复杂的子系统中引入外观模式以简化接口是非常有价值的,但如果一个子系统本身不够复杂,那么引入外观模式可能就是多余的,甚至会给系统增加额外的维护负担。
四、外观模式的最佳实践和常见误区
4.1 实现外观模式的步骤与技巧
实现外观模式通常遵循一系列步骤,这有助于确保你的设计简化了复杂系统的交互,同时保留了系统的灵活性。以下是实现外观模式的基本步骤以及一些有用的技巧:
实现步骤:
1. 分析子系统:
2. 规划接口:
3. 实现外观类:
4. 简化交互:
5. 客户端迁移:
6. 测试:
7. 文档:
|
技巧:
1. 单一职责:
2. 关注客户端需求:
3. 透明性:
4. 保持子系统独立性:
5. 引入抽象层:
|
将这些步骤与技巧应用到实践中,你将能成功实现一个既清晰又有用的外观模式,有效地简化了系统的复杂性。记住,设计模式的实施应该是为了解决特定的问题,而非强行套用。因此,始终需要根据具体情况和需求灵活应用这些步骤和技巧。
4.3 挑战与陷阱
外观模式作为一种常见的设计模式,为我们提供了一个简化复杂子系统访问的便捷途径。然而,正如任何工具或方法一样,外观模式在应用过程中也可能遇到一些挑战和陷阱。
过度封装导致的灵活性降低
外观模式的核心思想是将子系统的复杂性隐藏在一个简单的接口背后。但当这个接口设计得过于严格或过于封装时,可能会限制子系统的灵活性和扩展性。例如,如果外观类中的方法不允许外部调用者直接访问子系统的某些功能,那么当这些功能需要被修改或扩展时,就可能需要修改外观类,这增加了代码的维护成本。 |
难以适应快速变化的需求
随着业务的发展,系统的需求可能会发生变化。如果外观类设计得过于固定,可能难以适应这些变化。例如,如果外观类只提供了一套固定的接口,但业务需求需要多种不同的访问方式,那么这种固定的外观类就可能成为系统的瓶颈。 |
可能导致过度依赖
外观模式通过提供一个统一的接口来简化子系统的访问,但这也可能导致客户端过度依赖外观类。如果外观类出现问题或需要被替换,那么可能会影响到大量的客户端代码。 |
难以调试和维护
由于外观模式隐藏了子系统的复杂性,当出现问题时,可能会难以定位问题的根源。此外,如果外观类过于复杂,也可能会增加代码的阅读和维护难度。 |
4.3 如何应对这些挑战
1. 适度封装:
2. 灵活设计:
3. 避免过度依赖:
4. 良好的文档和测试:
|
总之,外观模式是一种强大的工具,可以帮助我们简化复杂子系统的访问。但在应用过程中,我们也需要注意避免其可能带来的挑战和陷阱。
五、外观模式与相似模式的比较
外观模式(Facade)、中介者模式(Mediator)、适配器模式(Adapter)都属于设计模式中的结构型模式,它们在不同的方面提供了简化类与类之间的相互作用的解决方案。尽管它们有一些共同目的,如简化接口或解耦组件,它们的应用场景和实现方法却有很大不同。
5.1 外观模式 (Facade)
1. 目的:
2. 使用场景:
3. 实现方式:
4. 解耦:
|
5.2 中介者模式 (Mediator)
1. 目的:
2. 使用场景:
3. 实现方式:
4. 解耦:
|
5.3 适配器模式 (Adapter)
1. 目的:
2. 使用场景:
3. 实现方式:
4. 解耦:
|
总的来说,这三种模式在某种程度上都提供接口的抽象,但它们的应用场景和目的是不同的。外观模式隐藏了复杂的内部逻辑,只是提供了一个统一简化的接口;中介者模式主要用于减少对象之间交互的复杂性;而适配器模式主要是用来连接两个不兼容的接口,使它们能够协同工作。在实际使用时,软件开发者应当根据具体的需求选择合适的模式。
六、掌握外观模式的未来
6.1 预测与趋势
外观模式在现代软件开发中继续保持其重要性,尤其是因为软件系统不断增长和复杂化。在多个层面上,外观模式的应用方向和趋势体现在以下几个方面:
1. 微服务架构:
2. API网关:
3. 库和框架:
4. 云服务抽象:
5. 设计系统并行性:
6. 前端框架与库:
7. 兼容性和遗留系统集成:
8. 测试和模拟:
|
外观模式在构建简单、清晰且高效的软件架构方面提供了重要的设计工具。随着软件复杂性的增加和技术的发展,充分利用外观模式来简化设计、提高代码可维护性和降低学习曲线的需求仍将继续。
6.2 持续发展
外观模式与未来设计模式融合前景的几点观点: 1. 结合其他模式:
2. 更灵活的外观接口:
3. 自动化的外观生成:
4. 基于领域驱动设计的外观:
5. 异步与并发支持:
需要注意的是,设计模式是根据问题和需求而产生的,当前已经存在的设计模式也已经为人们解决了很多问题。但是,随着技术的进步和软件开发的发展,新的设计模式有可能随之出现,为将来的软件开发提供更好的解决方案。因此,未来外观模式与其他设计模式的融合是一个有趣和开放的问题,需要根据具体情况和需求进行实践和探索。 |
结语:简化之美
外观模式的核心价值
1. 简化复杂性:
2. 提高可维护性:
3. 松耦合:
|
外观模式在软件开发中的重要性
1. 提高代码质量:
2. 促进团队协作:
3. 适应变化:
|
外观模式在软件开发中具有很高的价值。它不仅能够简化复杂性、提高可维护性和实现松耦合,还有助于提高代码质量、促进团队协作和适应变化。因此,在实际开发中,我们应该积极运用外观模式来优化软件设计,提高软件系统的整体质量和效率。
相关文章:

探索设计模式的魅力:外观模式简化术-隐藏复杂性,提供简洁接口的设计秘密
设计模式专栏:http://t.csdnimg.cn/U54zu 目录 引言:探索简化之路 一、起源和演变 二、场景案例分析 2.1 不用模式实现:用一坨坨代码实现 2.2 问题 2.3 外观模式重构代码 定义 界面 接口 利用外观模式解决问题步骤 外观模式结构和说明 重构…...

java之Maven
1. maven Maven是管理和构建java项目的工具 项目依赖资源(jar包)的管理,避免版本冲突统一项目结构项目构建,标准跨平台(Linux,window,MacOS)的自动化项目管理 2.maven依赖仓库 2.maven安装 maven安装视频教程 3. IDEA集成Maven 4. maven的依赖范围 5. maven生命…...

Elasticsearch(四)
是这样的前面的几篇笔记,感觉对我没有形成知识体系,感觉乱糟糟的,只是大概的了解了一些基础知识,仅此而已,而且对于这技术栈的学习也是为了在后面的java开发使用,但是这里的API学的感觉有点乱!然…...

蓝桥杯-X图形
问题描述 给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个 45度斜线方向引出的直线段组成,四条线段的长度相同,而且四条线段上的字母和中心点的字母相同。 一个 X 图形可以使用三个整数 r,c,L 来描述,其中 r,c 表示中心点位于第 r 行…...

2. Maven 继承与聚合
目录 2. 2.1 继承 2.2继承关系 2.2.1 思路分析 2.2.2 实现 2.1.2 版本锁定 2.1.2.1 场景 2.1.2.2 介绍 2.1.2.3 实现 2.1.2.4 属性配置 2.2 聚合 2.2.1 介绍 2.2.2 实现 2.3 继承与聚合对比 maven1:分模块设计开发 2. 在项目分模块开发之后啊&#x…...

如何把手机平板变为电脑的屏幕
文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等,均可作为电脑的扩展屏,为电脑增加一块显示屏,本文介绍如何使用免费的软件s…...

Amazon Dynamo学习总结
目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统,旨在解…...

appium抓包总结
appium抓包总结 背景:有些app通过抓包工具charles等抓不到接口数据,应为这一类抓包工具只能抓到应用层的数据包,而某些app的接口是走的传输层协议,所以此时只能通过AppIUM工具来进行抓包。 1、Appium 是什么? Appium…...

arcgis各种版本下载
arcgic 下载!!! ArcGIS是一款地理信息系统软件,由美国Esri公司开发。它提供了一系列完整的GIS功能,包括地图制作、空间数据管理、空间分析、空间信息整合、发布与共享等。ArcGIS是一个可扩展的GIS平台,提供…...

第五篇:MySQL常见数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中,需要者可移步自取,如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 (注:decimal类型举例,如1…...

Oracle用BETWEEN AND查某年的数据可能会丢失条数
随便找一张有日期(字段类型为DATE)的表即可测试。 假设存在这样一张表HOLIDAY,里面存储的是某些国家(表字段为COUNTRY_CODE)某些年的法定假日日期(表字段为HOLIDAY_DATE)。 我想查中国在2023年和2024年的法定假日日期。 BETWEEN AND 首先想…...

Nuscenes数据集点云数据如何转换到图像上
零、概要 注意:该文章是手写ai自动驾驶,Nuscenes数据集的笔记。 首先,学习需要使用到 nuScenes 数据集。python 工具需要使用到 nuscenes-devkit、pyquaternion from nuscenes.nuscenes import NuScenes from pyquaternion import Quatern…...

【C语言期末】商品管理系统
本文资源:https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括:包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求:1、信息首先保存在文件中,然后打开文件进行…...

单片机学习笔记---串口通信(2)
目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出: 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出: 方式2和…...

【Java】乐观锁有哪些常见实现方式?
Java中的乐观锁主要有两种常见的实现方式: CAS(Compare and Swap):这是实现乐观锁的核心算法。CAS操作包含三个参数:内存地址V、旧的预期值A和要修改的新值B。执行CAS操作时,会先比较内存地址V中的值是否等…...

Javaweb之SpringBootWeb案例之登录校验功能的详细解析
2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…...

CSS之盒模型
盒模型概念 浏览器盒模型(Box Model)是CSS中的基本概念,它描述了元素在布局过程中如何占据空间。盒模型由内容(content)、内边距(padding)、边框(border)、和外边距&…...

博客系统-SpringBoot版本
相比于之前使用Servlet来完成的博客系统,SpringBoot版本的博客系统功能更完善,使用到的技术更接近企业级,快来看看吧~ 目录 1.项目介绍 2.数据库准备 3.实体化类 4.返回格式 5.登录和注册功能 6.登出(注销)功能…...

详细分析Redis中数值乱码的根本原因以及解决方式
目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读: Redis框架从入门到学精(全)Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) …...

网络专栏目录
大家好我是苏麟 , 这是网络专栏目录 . 图解网络 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 图解网络目录 基础篇 基础篇 TCP/IP网络模型有几层? : TCP/IP网络模型 键入网址到页面显示,期间发生了什么? : 键入网址到页面显示,期间发生了什么 现阶…...

【Python网络编程之Ping命令的实现】
🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之Ping命令的实现 代码见资源,效果图如下一、实验要求二、协议原理2…...

OpenHarmony轻量级驱动开发
OpenHarmony轻量级驱动开发 思维导图: https://download.csdn.net/download/lanlingxueyu/88817155 GPlO(General-purpose input/output)即通用型输入输出 描述 GPlO(General-purpose input/output)即通用型输入输出。通俗地说,GPlO口就是一些引脚可以通过它们输出高低…...

C语言如何输⼊字符数组?
一、问题 在程序中,scanf()函数可以输⼊任意类型的数据,gets()函数只能输⼊字符串等,但是如何更好地输⼊字符数组呢? 二、解答 我们知道如何使⽤格式输⼊函数 scanf(),那么可以使⽤%c 格式符逐个输⼊字符。这样输⼊有…...

人脸追踪案例及机器学习认识
1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装,我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在,只需要使用哈尔特征检测得到人脸在图像中的位置,再指示舵机运…...

鸿蒙开发理论之页面和自定义组件生命周期
1、自定义组件和页面的关系 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…...

docker-compose部署gitlab和jenkins
通过docker-compose部署gitlab和jenkins,方便后续工作 注意: gitlab占用资源较多,最好系统内存在8G以上,CPU4核心以上,否则gitlab有可能报错无法启动。docker版本用最新版本,低版本的docker可能会导致doc…...

Pytorch 复习总结 1
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》 本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。 Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1&…...

谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)
目录 模糊测试的智能化和自动化 模糊测试不能代替安全设计原则 AI驱动的漏洞修补...

华为配置内部人员接入WLAN网络示例(802.1X认证)
配置内部人员接入WLAN网络示例(802.1X认证) 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络,使用802.1X客户端进行认证,输入正确的用户名和密…...

EXCEL中如何调出“数据分析”的菜单
今天发现,原来WPS还是和EXCEL比,还是少了“数据分析”这个日常基本做统计的菜单,只好用EXCEL了,但奇怪发现我的EXCEL中没发现这个菜单,然后查了下,才发现,要用如下的方法打开: 1&…...