当前位置: 首页 > news >正文

设计模式系列-外观模式

一、上篇回顾

上篇我们主要讲述了创建型模式中的最后一个模式-原型模式,我们主要讲述了原型模式的几类实现方案,和原型模式的应用的场景和特点,原型模式

适合在哪些场景下使用呢?我们先来回顾一下我们上篇讲述的3个常用的场景。

1、我们在运行态的时候,动态的创建一个动态类型的对象的时候,可能我们使用原型模式,可以动态的创建指定类型的副本,这无疑是好的选择,否

则如果通过我们前面讲述的几个创建型模式来实现的话,效率和代价上是非常大的。

2、有的时候我们需要对比一个对象在处理前和处理后进行对象状态的对比,对比是否处理后对象的状态是否发生变化,或者是其他的要求。这个时候

通过原型模式来克隆对象的副本,远比通过引入其他的Factory或者abstract Factory 来的有效和更容易实现。

3、如果我们发现有一类这样的对象,这类对象通常来说比较简单,并且这类对象之间的差别很有规律,并且这类对象数量一般有限,那么这个时候,

我们通过原型模式来做的话,通过一个对象来复制创建其他类型的对象可能比通过引入其他的Factory或者abstract Factory 更容易实现,而且只需要对

象本身提供一个Clone()方法即可。

4、有的时候我们的项目中有这样的情况,我们是在别人的功能的基础上进行扩展,我们有不能修改现有的程序,如果这个应用程序是基于其他类型的

创建型模式,那么如果我们在系统中新增一个类型的时候,我们需要修改统一的创建型模式中的代码,不管是修改配置文件还是具体的功能代码,无疑都是

要修改的,那么如果我们通过原型模式的话,只需要在新增类型的对象内部,提供一个克隆方法即可,完成新对象的创建。

通过上面的情况,那么我们也能大概看出来原型模式的有一个前提,就是必须是基于对象之上调用Clone()方法完成对象的复制,如果没有创建这个对

象的话,可能不能直接使用该方法。

我们也讲述了,对于Clone()对象的时候,深复制和浅复制的情况,还包括通过序列化对象的形式来完成对象的深复制。

二、摘要

本文主要是讲述结构型模式中一个比较常用的模式-外观模式,这个模式呢, 有个最大的特点将细粒度的对象包装成粗粒度的对象 ,应用程序通过

访问这个外观对象,来完成细粒度对象的调用,外观模式一般是分布式应用和系统架构中的应用服务层的设计中常用的方式,并且一般结合外观模式+DTO

来完成服务层的设计,提供分布式应用服务的高效服务,外观模式我们可以这样理解,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具

体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。本文将会从以下几个方面进行讲述:

1、外观模式的使用场景和特点

2、外观模式的实现方案。

3、总结外观模式。

我们这里先给出一个外观模式的原理图:

[外链图片转存中…(img-uEw5sy36-1694043709816)]这是未使用外观模式之前的情况,下面给出使用外观模式后的情形:

clip_image002通过外观对象来组织细粒度的服务的调用,外观对象提供给外部应用程序可

以使用的服务,而具体的调用细粒度的过程则被外观对象给封装起来,当然这个过程就是封装变化的部分,而将变化的部分与应用程序进行隔离,无疑对程

序的易用性和可维护性都是很大的提高。

三、本文大纲

a、上篇回顾。

b、摘要。

c、本文大纲。

d、外观模式的特点及使用场景。

e、外观模式的实现方案。

f、外观模式使用总结。

g、系列进度。

h、下篇预告。

四、外观模式的特点及使用场景

外观模式的主要思想是将复杂的细粒度的对象服务包装成简单的易使用的粗粒度的功能服务,我们大家最容易理解和知道的外观模式就是,使用的API

接口的封装,我们将第三方的API接口引入到我们的项目中的时候,我们需要对这些接口进行包装,将细粒度的具体调用过程进行包装成外观类的形式,通

过外观类来进行统一的调用。我们平时把一些常用的公共方法也可以简易的称之为外观模式,我们将复杂的细粒度的功能,包装成一个比较通用的简易的的

粗粒度的功能。我们来看看哪些场景下,我们使用外观模式很适合呢?

1、我们在使用第三方类库或者API的时候,我们通过本地的API接口的封装,来完成对第三方API接口的粗粒度外观对象,通过这个外观对象可以很容

易的完成服务的调用。我们这里举例说明吧,例如现在我有一个发送手机短信的API接口,是第三方提供给我的API接口,那么我如何包装呢?

下面给出对API封装的相关代码和说明

public class MessageHelper
{
private static readonly MessageHelper instance = new MessageHelper();

#region API接口

[DllImport(“EUCPComm.dll”, EntryPoint = “SendSMS”)] //即时发送
private static extern int SendSMS(string sn, string mn, string ct, string priority);

[DllImport(“EUCPComm.dll”, EntryPoint = “SendSMSEx”)] //即时发送(扩展)
private static extern int SendSMSEx(string sn, string mn, string ct, string addi, string priority);

[DllImport(“EUCPComm.dll”, EntryPoint = “SendScheSMS”)] // 定时发送
private static extern int SendScheSMS(string sn, string mn, string ct, string ti, string priority);

#endregion

#region 对上面的API包装后的方法

public int SendSMSEx1(string sn, string mn, string ct, string addi, string priority)
{
return SendSMSEx(sn, mn, ct, addi, priority);
}

public int SendSMS1(string sn, string mn, string ct, string priority)
{
return SendSMS(sn, mn, ct, priority);
}

public int SendScheSMS1(string sn, string mn, string ct, string ti, string priority)
{
return SendScheSMS(sn, mn, ct, ti, priority);
}

#endregion
}

相关的测试代码:

static void Main(string[] args)
{
//相关的测试代码
//调用外观对象中的服务
MessageHelper.instance.SendSMS1(“”, “”, “”, “”);
}

2、我们在架构设计的过程中,一次的功能访问可能需要同时的调用很多个对象,那么如果我们在服务调用的时候,能够在应用程序调用中一次就能完

成所有要同时调用的对象那该多好啊,外观模式无疑是最好的原则,特别是在分布式应用中,通过远程调用服务,通过外观模式降低应用程序与服务的交互

次数,同时可以降低应用程序的复杂性。外观模式+DTO,提供远程服务调用的性能,这些都是好的设计方式。我们来看看简单的示例吧,我想我们更

能了解其中的奥妙。看图说话吧,我们这里以一次远程同步服务为例。

未使用外观模式前:

clip_image003一个简单的同步服务,由于应用程序在这次服务中为了完成同步操作,必须进行3次远程连接来进

行把3个对象进行同步,那么如果我们使用外观对象之后呢,我们只需要访问一次即可完成3个对象的同步。这无疑提高了系统的性能和效率。

[外链图片转存中…(img-uNaCtzwz-1694043709817)]并且通过DTO来进行传输的话,可以提供远程服务调用的访问此时和效率。

五、外观模式的实现方案

5.1 外观模式的经典实现

我们先来看看外观模式的经典实现,我们这里已二进制流序列化服务外观为例来说明下经典实现吧

定义一个二进制序列化外观类:

public class SerializationFacede
{
public string BinarySerializationObjToString(object target)
{
using (MemoryStream stream = new MemoryStream())
{
new BinaryFormatter().Serialize(stream, target);

byte[] targetArray = stream.ToArray();

return Convert.ToBase64String(targetArray);
}
}

public object DerializationStringToObj(string target)
{
byte[] targetArray = Convert.FromBase64String(target);
using (MemoryStream stream = new MemoryStream(targetArray))
{
return new BinaryFormatter().Deserialize(stream);
}
}

public T Derialization(string target)
{
return (T)DerializationStringToObj(target);
}
}

我们这里给出相关的测试代码:

static void Main(string[] args)
{
//外观类
SerializationFacede facede = new SerializationFacede();
//测试对象类
Product product = new Product();

//序列化对象
string productString= facede.BinarySerializationObjToString(product);
//反序列化对象
product = facede.Derialization(productString);
}

通过上面的代码我们可以看出,其实外观类也可以以静态方法的形式来提供,提供一个统一的访问入口,这里可以使用我们前面讲述的单例模式来解决这个

问题。或者提供一个外观对象的创建型工厂来完成创建,而不是通过new()的方式来使用。

我们可以改进一下上面的外观模式,通过定义接口,来解耦客户端程序的调用,通过提供一个接口,客户调用通过接口的形式来调用,无疑就可以解

决这样依赖关系:

我们先来看看接口的定义形式:

///
/// 序列化服务的外观接口
///
public interface ISerializationFace
{
string SerializableToString(object target);

object DerializableToObject(string target);

T Derializable(string target);
}

我们分别实现SOAP与二进制的形式来实现我们定义的服务外观接口:

二进制序列化服务:

public class BinarySerializationFace : ISerializationFace
{
#region ISerializationFace 成员

public string SerializableToString(object target)
{
throw new NotImplementedException();
}

public object DerializableToObject(string target)
{
throw new NotImplementedException();
}

public T Derializable(string target)
{
throw new NotImplementedException();
}

#endregion
}

SOAP序列化服务:

public class SoapSerializationFace : ISerializationFace
{
#region ISerializationFace 成员

public string SerializableToString(object target)
{
throw new NotImplementedException();
}

public object DerializableToObject(string target)
{
throw new NotImplementedException();
}

public T Derializable(string target)
{
throw new NotImplementedException();
}

#endregion
}

测试代码如下:

static void Main(string[] args)
{
//外观类
ISerializationFace facede = new SoapSerializationFace();
//测试对象类
Product product = new Product();

//序列化对象
string productString = facede.SerializableToString(product);
//反序列化对象
product = facede.Derializable(productString);
}

这样我们就提高了外观模式的灵活性。

5.2、外观模式的其他考虑

5.2.1-传统外观模式的扩展

上面给出的外观模式,我们在具体的测试代码中还是直接通过new()具体的序列化对象的形式,我们这里可以进行改进,通过工厂模式,或者是通过配

置文件的形式来解耦,一般可能外观类不多的情况下,通过配置文件的方式来进行解耦是不错的选择,而不用提供单独的工厂去创建。

我们可以通过如下的形式来改进上面的方案,例如我们的配置文件的格式定义如下:

<?xml version="1.0" encoding="utf-8" ?>

那么我们看看序列化工厂带示例代码

public class SerializationFactory
{
public static ISerializationFace Create()
{
//配置文件中读取的Type类型
string type = XMLHelper.GetSectionValue(“”);
return (ISerializationFace)Activator.CreateInstance(Type.GetType(type));
}
}

我们来看看具体的测试代码:

static void Main(string[] args)
{
//外观类
ISerializationFace facede = SerializationFactory.Create();
//测试对象类
Product product = new Product();

//序列化对象
string productString = facede.SerializableToString(product);
//反序列化对象
product = facede.Derializable(productString);
}

5.2.2-传统外观模式的扩展

下面给我们来看看另外一种形式的外观模式中的DTO+外观模式的实例实现代码

我们看看DTO的形式:

///
/// DTO(数据传输对象),也可以称之为数据载体
///
public class DTO
{

private Product _product;
private List _orderList;
//全部都是数据信息或者是其他的引用对象信息
public Product Product
{
get
{
return this._product;
}
set
{
this._product = value;
}
}
public List Product
{
get
{
return this._orderList;
}
set
{
this._orderList = value;
}
}

}

具体使用DTO对象的外观类代码如下:

///
/// 远程访问服务
///
public class AccessService
{
bool GetService(DTO dto)
{
return true;
}

DTO GetData()
{
return new DTO();
}
}

通过这样的简易的方式即可完成服务的访问。

程序的测试代码如下:

static void Main(string[] args)
{
//外观类
AccessService service = new AccessService();

DTO dto= service.GetData();
//TODO…
}

通过上面的代码,我们完成了最简单的远程外观的访问服务,远程的外观服务还可以通过WCF的形式来完成,由于WCF内置集成了Remoting和

WebService的形式调用,或者是socket的形式。我这里就不详细的介绍了

六、外观模式使用总结

外观模式作为结构型模式中的一个简单又实用的模式,外观模式通过封装细节来提供大粒度的调用,直接的好处就是,封装细节,提供了应用写程序

的可维护性和易用性。外观模式一般应用在系统架构的服务层中,当我们是多个不同类型的客户端应用程序时,比如一个系统既可以在通过Web的形式访

问,也可以通过客户端应用程序的形式时,可能通过外观模式来提供远程服务,让应用程序进行远程调用,这样通过外观形式提供服务,那么不管是什么样

的客户端都访问一致的外观服务,那么以后就算是我们的应用服务发生变化,那么我们不需要修改没一个客户端应用的调用,只需要修改相应的外观应用即

可。

七、系列进度

创建型

1、系统架构技能之设计模式-单件模式

2、系统架构技能之设计模式-工厂模式

3、系统架构技能之设计模式-抽象工厂模式

4、系统架构技能之设计模式-创建者模式

5、系统架构技能之设计模式-原型模式

结构型

1、系统架构技能之设计模式-组合模式

2、系统架构技能之设计模式-外观模式

3、系统架构技能之设计模式-适配器模式

4、系统架构技能之设计模式-桥模式

5、系统架构技能之设计模式-装饰模式

6、系统架构技能之设计模式-享元模式

7、系统架构技能之设计模式-代理模式

行为型

1、系统架构技能之设计模式-命令模式

2、系统架构技能之设计模式-观察者模式

3、系统架构技能之设计模式-策略模式

4、系统架构技能之设计模式-职责模式

5、系统架构技能之设计模式-模板模式

6、系统架构技能之设计模式-中介者模式

7、系统架构技能之设计模式-解释器模式

八、下篇预告

下篇将会针对外观模式进行讲述,该模式也是结构型模式中很有特点设计模式之一,该 模式是将现有系统中的一些细粒度的东西通过外观对象包装起来,

在应用程序中访问这些方法的时候,通过外观类的形式,提供统一的访问入口,并且具体的细节,应用程序并不需要知道,这样就会降低程序调用的复杂

性,由于本人水平有限,不足或者有错误的地方,请大家批评指正,请大家继续支持我,谢谢。

九、Demo下载

本文Demo

相关文章:

设计模式系列-外观模式

一、上篇回顾 上篇我们主要讲述了创建型模式中的最后一个模式-原型模式&#xff0c;我们主要讲述了原型模式的几类实现方案&#xff0c;和原型模式的应用的场景和特点&#xff0c;原型模式 适合在哪些场景下使用呢&#xff1f;我们先来回顾一下我们上篇讲述的3个常用的场景。 1…...

DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】

本文介绍DBeaver 下载、安装与数据库连接&#xff08;MySQL&#xff09;的详细教程 一、DBeaver 下载 官网下载地址&#xff1a;https://dbeaver.io/download/ 二、安装 1、双击下载的安装包&#xff0c;选择中文 2、点击下一步 3、点击我接受 4、如下勾选&#xff0c;…...

使用adjustText解决标签文字遮挡问题python

使用adjustText解决文字遮挡问题 1、一个例子2、adjust_text的用法使用pip install adjustText或conda install -c conda-forge adjusttext来安装adjustText。安装成功之后,首先生成随机示例数据以方便之后的演示: 1、一个例子 我们先不使用adjustText调整图像,直接绘制出原…...

[论文笔记]SiameseNet

引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…...

只有个体户执照,可以用来在抖音开店吗?抖店开通问题解答

我是王路飞。 在抖音开店的门槛&#xff0c;本身就是需要有营业执照的。 至于执照的类型&#xff0c;其实主要看商家自己。 如果你是新手商家&#xff0c;之前也没有怎么接触过电商行业&#xff0c;那么用个体执照在抖音开店足够用了&#xff0c;毕竟你要先入门&#xff0c;…...

微服务高可用容灾架构设计

导语 相对于过去单体或 SOA 架构&#xff0c;建设微服务架构所依赖的组件发生了改变&#xff0c;因此分析与设计高可用容灾架构方案的思路也随之改变&#xff0c;本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…...

记录docker 部署nessus

1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 &#xff1a;注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…...

qt 正则表达式

以上是正则表达式的格式说明 以下是自己写的正则表达式 22-25行 是一种设置正则表达式的方式&#xff0c; 29-34行 : 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0-321的任意数字都可以输入 31行 将过滤格式保存到过滤器对象里面 32行 将验…...

l8-d13 UNIX域套接字

一、UNIX 域流式套接字 本地地址 struct sockaddr_un { unsigned short sun_family; /* 协议类型 */ char sun_path[108]; /* 套接字文件路径 */ }; UNIX 域流式套接字的用法和 TCP 套接字基本一致&#xff0c;区别在于使用的协议和地址不同 UNIX 域流式套接字服务器…...

@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?

这是 Lombok 语法糖写法。 在我们写controller或者Service层的时候&#xff0c;需要注入很多的mapper接口或者另外的service接口&#xff0c;这时候就会写很多的AutoWired注解 lombok提供注解&#xff1a; RequiredArgsConstructor(onConstructor __(Autowired))写在类上可以…...

FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程

FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。…...

Mybatis 动态语言 - mybatis-velocity

前面我们介绍了Mybatis动态SQL的使用&#xff1b;本篇我们介绍使用mybatis-velocity动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 动态SQL – 使用if,where标签动态生成条件语句…...

Fourier傅里叶变换的线性性质和位移性质

Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1​(…...

# 磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm

磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm 磁盘、分区、引导等知识经常似懂非懂&#xff0c;不能完全说清楚&#xff0c;梳理下&#xff1a; 序号主板芯片引导方式支持的磁盘分区表类型支持的磁盘分区表格式对应引导位置备注1BIOS传统方式&#xff08;俗…...

Java中同时POST文件和提交JSON数据的方法

一、引言 在Java中&#xff0c;可以使用java.net.URLConnection类来进行HTTP请求&#xff0c;并实现同时POST文件和提交JSON数据的功能。下面将通过一篇文章的形式为您详细讲解这个过程。 二、实现步骤 步骤一&#xff1a;导入所需的类库 首先&#xff0c;你需要导入以下类…...

【React】React获取URL参数,根据URL参数隐藏页面元素

React获取URL参数&#xff0c;根据URL参数隐藏页面元素 AI推荐方法 如果您想使用React获取URL参数并相应地隐藏页面元素&#xff0c;可以按照以下步骤进行操作&#xff1a; 导入React和React DOM&#xff1a; import React from react; import ReactDOM from react-dom;创建…...

第68步 时间序列建模实战:ARIMA建模(Matlab)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用Matlab进行SARIMA模型的构建。 不同样&#xff0c;这里使用另一个数据&#xff1a; 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic …...

Gin学习记录3——模版与渲染

模版与渲染 一. 返回二. 模版2.1 基础模版2.2 同名模版2.3 模版继承2.4 模版语法 一. 返回 如果只是想返回数据&#xff0c;可以使用以下函数&#xff1a; func (c *Context) JSON(code int, obj any) func (c *Context) JSONP(code int, obj any) func (c *Context) String(…...

Python算法练习 9.11

leetcode 392 判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcd…...

2023年中秋节和国庆节放假几天?用待办软件记录放假安排并提醒

进入公历9月&#xff0c;我们都期待着下个长假的到来。那么2023年中秋节和国庆节放假几天呢&#xff1f;因为今年的中秋节是公历的9月29日&#xff0c;所以今年的中秋节和国庆节是连在一起放假的。放假时间安排是9月29日至10月6日&#xff0c;一共放假8天。而10月7日和8日则是调…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...