重温设计模式--适配器模式
文章目录
- 适配器模式(Adapter Pattern)概述
- 适配器模式UML图
- 适配器模式的结构
- 目标接口(Target):
- 适配器(Adapter):
- 被适配者(Adaptee):
- 作用:
- C++ 代码示例
- C++示例代码2
- 应用场景
- 系统集成与接口兼容
- 第三方库集成:
- 旧代码适配新架构:
- 软件模块交互与协作
- 跨平台开发中的适配:
适配器模式(Adapter Pattern)概述
定义:
适配器模式是一种结构型设计模式,它的主要作用是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。就好像一个 “转换器”,把不匹配的接口进行适配,让它们能够相互对接使用。
适配器模式UML图
适配器模式的结构
目标接口(Target):
这是客户端所期望使用的接口,定义了客户端需要调用的方法集合。它代表了一种规范或者协议,客户端代码是基于这个接口来进行操作的。
适配器(Adapter):
它实现了目标接口,同时在内部持有一个被适配者的实例,并通过调用被适配者的相关方法来实现目标接口中定义的方法,以此来完成接口的转换工作,使得客户端可以通过目标接口来间接使用被适配者的功能。
被适配者(Adaptee):
它是已经存在的、具有特定功能但接口不符合要求的类或对象。其接口可能包含与目标接口相似但不完全相同的方法,或者方法名称、参数等方面存在差异。
作用:
解决接口不兼容问题:在软件开发过程中,经常会遇到需要使用一些现有的类,但这些类的接口与当前系统所期望的接口不一致的情况。适配器模式通过创建一个中间适配器类,对原有类的接口进行包装转换,使其符合新的使用要求,从而避免了对原有类进行大规模修改,保护了已有的代码资产。
提高代码的复用性:可以复用那些已经经过测试、功能完善但接口不符合要求的类,只需要添加适配器类来适配接口,就能让它们融入新的系统环境中继续发挥作用,减少了重复开发的工作量。
增强系统的灵活性和可扩展性:当系统需要接入新的外部组件或者更换底层实现时,如果存在接口不兼容的情况,通过编写适配器就能方便地实现对接,使得系统可以更容易地与不同的外部模块集成,应对各种变化。
C++ 代码示例
以下以一个简单的电源适配器的例子来展示适配器模式在代码中的应用。假设我们有一个手机充电器,它期望的输入电压是 5V,而我们现有的电源输出电压是 220V,需要一个适配器来将 220V 的电压转换为 5V 供手机充电器使用。
// 目标接口,代表手机充电器期望的输入接口
class ChargerTarget{
public:virtual void chargeWith5V() = 0;
};// 被适配者,代表现有的220V电源,有输出220V电压的方法
class PowerSource
{
public:void output220V() {std::cout << "输出220V电压" << std::endl;}
};// 适配器类,将220V电源适配成手机充电器能用的5V电源
class VoltageAdapter : public ChargerTarget{
private:PowerSource* powerSource;
public:VoltageAdapter(PowerSource* source){powerSource = source;}void chargeWith5V() override{powerSource->output220V();std::cout << "经过适配器转换,输出5V电压用于充电" << std::endl;}
};int main()
{PowerSource powerSource;VoltageAdapter adapter(&powerSource);ChargerTarget* charger = &adapter;charger->chargeWith5V();return 0;
}
在上述代码中:
ChargerTarget是目标接口,定义了chargeWith5V方法,代表手机充电器期望的输入接口规范,客户端希望调用这个接口来实现充电功能。
PowerSource是被适配者,它原本有自己的output220V方法,输出的是 220V 电压,不符合手机充电器直接使用的要求。
VoltageAdapter是适配器类,它实现了ChargerTarget接口,内部持有PowerSource对象的指针。在chargeWith5V方法中,先调用PowerSource的output220V方法获取 220V 电压,然后模拟进行转换,输出符合要求的 5V 电压,从而使得原本不匹配的电源和手机充电器能够协同工作,体现了适配器模式的基本原理和应用方式。
除了这种类适配器的形式(通过继承来实现适配),还有对象适配器(通过组合的方式,将被适配者对象作为适配器类的成员变量,代码结构稍有不同,但核心思想一致),可根据具体的应用场景和设计需求来选择合适的实现方式。
C++示例代码2
#include<iostream>
#include<string>
using namespace std;
//抽象球员类
class player
{protected:string m_name;
public:player(string str_name):m_name(str_name){}virtual void attack(){};virtual void defends(){};
};
//具体球员 前锋
class forwords:public player
{
public:forwords(string str_name):player(str_name){}void attack(){cout<<m_name<<"进攻"<<endl;}void defends(){cout<<m_name<<"防守"<<endl;}
};
//中锋
class center:public player
{
public:center(string str_name):player(str_name){}void attack(){cout<<m_name<<"进攻"<<endl;}void defends(){cout<<m_name<<"防守"<<endl;}
};class yaoming
{
private:string m_name;
public:yaoming(string str_name):m_name(str_name){}void attack_yaoming(){cout<<m_name<<"进攻"<<endl;}void defends_yaoming(){cout<<m_name<<"防守"<<endl;}
};class translate:public player
{
private:yaoming *s;
public:translate(string str_name):player(str_name){s = new yaoming("姚明");}void attack(){s->attack_yaoming();}void defends(){s->defends_yaoming();}};int main()
{player *s = new forwords("A");s->attack();player *s1 = new forwords("B");s1->attack();player *m_yaoming = new translate("姚明");m_yaoming->defends();m_yaoming->attack();return 0;
}
应用场景
系统集成与接口兼容
不同数据库的适配:当应用程序需要从一个数据库系统(如 MySQL)切换到另一个数据库系统(如 Oracle)时,由于数据库的 API 接口不同,就可以使用适配器模式。例如,原来的代码是基于 MySQL 的SELECT语句来查询数据,接口可能是mysql_query()函数。当切换到 Oracle 时,其查询接口是OCIStmtExecute()函数。可以创建一个适配器类,实现原来基于 MySQL 接口风格的函数,在内部将其转换为 Oracle 对应的函数调用,这样就可以在不大量修改上层业务逻辑代码的情况下完成数据库的替换。
第三方库集成:
在软件开发中,常常会使用第三方库来实现一些功能。如果第三方库的接口与项目中其他部分的接口不兼容,就可以使用适配器模式来整合。比如,一个图形绘制库的接口是接收坐标点的数组来绘制多边形,而项目中现有的图形数据存储格式是一系列的线段对象。这时可以创建一个适配器,将线段对象转换为坐标点数组的格式,使其能够被图形绘制库所使用。
旧系统改造与复用
旧代码适配新架构:
在对旧系统进行升级改造时,可能会引入新的架构或者设计模式。如果旧系统中的一些功能模块的接口不符合新架构的要求,就可以通过适配器模式来进行适配。例如,旧系统中有一个用户认证模块,它的接口是直接返回用户的基本信息字符串,而新架构要求通过一个对象来传递用户信息,包括用户名、密码、权限等多个属性。可以创建一个适配器类,将旧接口返回的字符串解析并封装成新架构所需要的用户信息对象,从而使旧的用户认证模块能够在新架构中继续使用。
硬件设备接口适配:在工业控制或者智能家居系统中,可能会存在新的控制系统与旧的硬件设备接口不匹配的情况。例如,新的智能控制系统期望通过网络协议接收和发送设备状态信息,而旧的传感器设备只有简单的串口通信接口并且数据格式不同。通过适配器模式,可以创建一个设备接口适配器,将串口通信的数据格式转换为网络协议的数据格式,并且处理通信方式的差异,使得旧设备能够在新的智能控制系统中正常工作。
软件模块交互与协作
不同模块间接口转换:在一个大型软件系统中,不同的模块可能是由不同的团队开发的,它们的接口设计可能没有考虑到相互之间的协作。当需要将这些模块集成在一起时,就可能会出现接口不兼容的问题。例如,一个数据处理模块输出的数据结构是链表形式,而另一个数据分析模块期望的数据结构是数组形式。可以通过适配器模式,创建一个数据结构适配器,将链表数据转换为数组数据,使得两个模块能够顺利地进行数据交互。
跨平台开发中的适配:
在跨平台应用开发中,不同的操作系统(如 Windows、Linux、macOS)提供的 API 接口有所不同。例如,在 Windows 系统中,创建窗口的函数是CreateWindow(),而在 Linux 系统下可能是通过XCreateWindow()函数(基于 X Window 系统)。为了使应用程序能够在不同的操作系统上运行,可以使用适配器模式。创建一个窗口创建适配器类,在不同的操作系统下实现不同的窗口创建函数,但是对外提供统一的窗口创建接口,这样就可以在跨平台开发中方便地处理操作系统接口的差异。
相关文章:
重温设计模式--适配器模式
文章目录 适配器模式(Adapter Pattern)概述适配器模式UML图适配器模式的结构目标接口(Target):适配器(Adapter):被适配者(Adaptee): 作用…...
API部署大模型
由于生产测试环境的服务器配置较低 不能够支撑大模型运行的配置 所以需要将大模型封装部署在A服务器上 在B服务器上进行调用 封装时可以使用FastAPI与Websocket两种通信方式进行通信 Websocket 在A服务器端部署大模型(服务端) import asyncio import …...
Linux -- 同步与条件变量
目录 同步 条件变量 pthread_cond_t pthread_cond_init(初始化条件变量) pthread_cond_destroy(销毁条件变量) pthread_cond_wait(线程等待条件变量) 重要提醒 pthread_cond_boardcast(…...
Linux之ARM(MX6U)裸机篇----1.开发环境搭建
下载开启FTP服务 作用:用于电脑与linux系统之前文件传输 如上,编辑完成后重启 Window下FTP客户端安装使用http://www.filezilla.cn/download网址下载 新建网络连接站点 主机后写虚拟机的ip地址,用ifconfig查出ipv4的地址 笔记本电脑中虚拟…...
【C语言】结构体模块化编程
在模块化编程中,结构体作为数据存储的主要方式之一,它不仅用于存储数据,还帮助实现代码的封装与隐私保护。通过将结构体定义放在 .c 文件中并使用 get_ 和 set_ 函数进行访问,我们可以实现对结构体数据的保护,同时降低…...
SpringCloudAlibaba技术栈-Nacos
1、什么是Nacos? Nacos是个服务中心,就是你项目每个功能模块都会有个名字,比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中,其他模块也是这样的。好处是这样能更好地管理项…...
Windows11家庭版启动Hyper-V
Hyper-V 是微软的硬件虚拟化产品,允许在 Windows 上以虚拟机形式运行多个操作系统。每个虚拟机都在虚拟硬件上运行,可以创建虚拟硬盘驱动器、虚拟交换机等虚拟设备。使用虚拟化可以运行需要较旧版本的 Windows 或非 Windows 操作系统的软件,以…...
《信管通低代码信息管理系统开发平台》Linux环境安装说明
1 简介 信管通低代码信息管理系统应用平台提供多环境软件产品开发服务,包括单机、局域网和互联网。我们专注于适用国产硬件和操作系统应用软件开发应用。为事业单位和企业提供行业软件定制开发,满足其独特需求。无论是简单的应用还是复杂的系统ÿ…...
第一节:电路连接【51单片机-L298N-步进电机教程】
摘要:本节介绍如何搭建一个51单片机L298N步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模块 ⑤二相四线步进电机 ⑥电线若干 二、接线 三、L298N模…...
YoloDotNet 识别图像中特定关键点的位置
文章目录 1、初始化 Yolo 对象2、加载图像与检测关键点3、处理检测结果4、自定义关键点绘制和处理5、注意事项1、初始化 Yolo 对象 设置 YoloOptions,包括模型路径、模型类型(如果有专门的关键点检测模型类型则指定)、GPU 使用相关参数等。例如: var yoloOptions = new Yo…...
山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)
1、设计目的 山景提供的SDK是蓝牙音箱demo,用户使用ADC按键或者IR遥控器,进行人机交互。然而现实很多场景,需要和单片机通信,不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示…...
Leetcode3218. 切蛋糕的最小总开销 I
题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数组: horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。verticalCut 的大小为 n - 1 …...
基于自然语言处理(NLP)的智能客服系统
基于自然语言处理(NLP)的智能客服系统是现代客户服务领域的一项重要技术,它通过模拟人类对话的方式,为用户提供及时、准确和个性化的服务。以下是关于基于NLP的智能客服系统的一些关键要素和功能: 1. 自然语言理解&am…...
RAG实战:构建基于本地大模型的智能问答系统
RAG实战:构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代,如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG(检索增强生成)技术,结合本地大模型,构建一个高效的智…...
三维扫描在汽车/航空行业应用
三维扫描技术应用范围广泛,从小型精密零件到大型工业设备,都能实现快速、准确的测量。 通过先进三维扫描技术获取产品和物体的形面三维数据,建立实物的三维图档,满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维…...
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
前面写了一篇关于使用AI IDE进行C安全开发的博客《使用AI IDE 助力 C 高性能安全开发!》, 得到许多同学们的喜欢,今天我们来继续在游戏开发中扩展一下AI的能力,看看能不能给游戏研发团队一些启发。 在游戏研发中,Lua曾…...
http的访问过程或者访问页面会发生什么
1. 建立连接 客户端与服务器之间需要建立 TCP 连接,常用步骤如下: DNS解析:客户端将目标 URL 转换为服务器的 IP 地址。三次握手:TCP 协议通过三次握手建立可靠连接,确保双方具备通信能力。传输层连接建立࿱…...
Lua 函数
Lua 函数 1. 概述 Lua是一种轻量级的编程语言,常用于游戏开发、脚本编写和嵌入式系统。在Lua中,函数是一等公民,意味着它们可以作为变量传递,也可以作为参数传递给其他函数。本文将详细介绍Lua中的函数,包括函数的定…...
产品升级!Science子刊同款ARGs-HOST分析,get!
凌恩生物明星chanpin 抗性宏基因-宿主分析 Science子刊同款分析 数据挖掘更进一步! 抗生素的大量使用与滥用使微生物体内编码抗生素抗性的基因在环境中选择性富集,致病菌通过基因突变或者水平基因转移获得抗生素抗性基因后,导致抗生素治疗…...
Kubernetes PV及PVC的使用
前提条件 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用 、Deloyment控制器拥有NFS服务,可参考:Linux环境搭建NFS服务 概述 Persistent…...
struct udp_sock
这个struct udp_sock结构体是Linux内核网络栈中用于表示一个UDP套接字的数据结构。它继承自struct inet_sock,这意味着它包含了所有IPv4或IPv6套接字共享的基础信息和函数指针。下面是对struct udp_sock中一些关键成员的解释: struct inet_sock inet;:这是udp_sock结构体的第…...
《机器学习》数据预处理简介
目录 1. 数据清洗(Data Cleaning) (1)处理缺失值 (2)处理异常值 (3)处理重复数据 2. 数据转换(Data Transformation) (1)特征缩…...
USB接口实现CDC(usb转串口功能)
主控:stm32f429 PHY芯片:usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置:根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…...
ubuntu 网络管理--NetworkManager
ubuntu 网络管理--NetworkManager 1 介绍2 NetworkManager 命令2 nmcli 命令显示可用的wifi AP连接wifi检查网络连接 ?? 如何删除删除网络连接查看设备状态添加一个新的以太网连接设置静态 IP 地址启用并测试连接添加新的wifi连接 3 其他命令参考 1 介绍 NetworkManager 是标…...
FLV视频封装格式详解
目录(?)[-] OverviewFile Structure The FLV headerThe FLV File BodyFLV Tag Definition FLVTAGAudio TagsVideo TagsSCRIPTDATA onMetaDatakeyframes Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure…...
每天五分钟机器学习:核函数
本文重点 在学习支持向量机算法之前,我们要继续学习一些数学基础,本文我们将学习核函数的概念。当数据线性不可分的时候,此时就需要核函数出场了,它可以将低维不可分的数据映射到高维可分数据,此时就可以完成数据分类了。 核函数的定义 核函数K(x, y)定义为两个数据点x…...
Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
Flutter开发HarmonyOS的好处: Flutter是谷歌公司开发的一款开源、免费的UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...
4-pandas常用操作
前言 一、DataFrame修改index、columns 1.获取index df2 pd.DataFrame(np.arange(9).reshape(3,3),index[sh,cs,bj],columns[a,b,c]) df2.index 2.修改index df2.index [shanghai,changsha,beijing] df2.columns [A,B,C] # 注意赋值的顺序 3.批量修改ÿ…...
Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇
历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...
【0376】Postgres内核 分配 last safe MultiXactId
上一篇: 【0375】Postgres内核 XLOG 之 设置下一个待分配 MultiXactId 和 offset 文章目录 1. 最后一个安全的 MultiXactId1.1 计算 multi wrap limit1.2 计算 multi stop limit1.3 计算 multi warn limit1.4 计算 multi vacuum limit2. 初始化 MultiXactState 成员3. 完成 mu…...
大模型时代的NL2SQL初探
大模型时代的NL2SQL初探 NL2SQL的基本概念NL2SQL的实现逻辑现代NL2SQL框架与技术大语言模型(LLM)在NL2SQL中的应用向量数据库的作用NL2SQL的应用场景未来展望 在当今信息化时代,数据库已成为各行各业的数据存储核心。然而,直接使用…...
Linux环境下使用tomcat+nginx部署若依项目
Linux Tomcat MySQL Java 是构建动态网站系统的完美解决方案之一,具有免费、高 效、扩展性强且资源消耗低等优良特性。 Java Web 凭借其优秀的开发框架和良好的生态被广 泛应用于社会各行业的信息化系统构建。 本实验以若依管理系统( http://ruo…...
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它支持数万台支持标准的网…...
06 - Django 视图view
HttpRequest 和 HttpResponse Django中的视图主要用来接受Web请求,并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...
MySQL数据库(锁)
1、MySQL有哪些锁? 全局锁:flush tables with read lock 执行以下语句之后,使用全局锁,整个数据库就处于只读状态了,这时其他线程执行对数据的增删改或者对表结构的更改操作操作,都会被阻塞。 全局锁的应…...
Mac Android studio 升级LadyBug 版本,所产生的bug
当Build 出现,这样的文字以后: Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …...
springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目
springboot/ssm社区助老志愿者服务平台Java代码编写web志愿捐赠活动项目 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&am…...
基于Java+Jsp Servlet Mysql实现的Java Web在线商城项目系统设计与实现
一、前言介绍: 1.1 项目摘要 随着互联网技术的飞速发展,电子商务已成为现代商业活动的重要组成部分。在线商城作为电子商务的一种重要形式,以其便捷性、高效性和广泛覆盖性,受到了越来越多消费者的青睐。同时,随着消…...
安装K8s集群
文章首发于我的博客 :https://blog.liuzijian.com/post/9aa6d426-a01c-05b0-6f7a-5da4343f0f9e.html 因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要科学上网访问DockerHu…...
【数据科学导论】第一二章·大数据与数据表示与存储
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据处理与分析_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言…...
LabVIEW数字式气压计自动检定系统
开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计,通过优化硬件组成和软件设计,实现高效率和高准确度的检定工作,有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…...
按行分割文本函数(C++)
文本分割函数SplitText2Line解析 以下是对SplitText2Line函数的详细介绍: void SplitText2Line(s8* strText, std::vector<std::string>& vecStrLines) {// 1. 清空存储结果的向量vecStrLines.clear();// 2. 打印原始文本信息(用于调试目的&…...
要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量
文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …...
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。 相关知识 为了完成本…...
使用Excel制作通达信自定义外部数据,安排!!!
Excel相信大家电脑上都有这个工具,相比敲编程代码,用这个去做自定义数据对大多数人,应该是比较友好的。自定义数据分为外部序列数据,看了一下内容理解起来比较多,分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…...
阿里云镜像服务使用指南
阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面向容器镜像、Helm Chart等符合OCI标准云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力,与容器服务A…...
adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);
下载老版本Platformtoolshttps://dl.google.com/android/repository/platform-tools_r28.0.2-windows.zip?hlzh-cn 替换原来的platform-tools文件夹即可。 问题原因分析:电脑端adb client版本(41)和安卓端adb …...
WPF TextBox 输入限制 详解
总目录 前言 通常对于WPF输入框 输入的控制无非以下方式 1 直接禁止输入(包括粘贴) 不符合要求的字符 如只可输入数字的输入框,当你输入字母的时候是无法输入的 2 输入后,校验内容是否符合要求,然后提示错误,禁止提交信息 如只可…...
安装Visual studio2022后,没法新建.net 4.5.2的项目
在Visual Studio 2022中无法新建.NET Framework 4.5.2的项目,通常是因为Visual Studio 2022默认不再支持较旧的.NET Framework版本,如4.5或4.5.2。不过,你可以通过一些手动步骤来使Visual Studio 2022支持.NET Framework 4.5.2项目。以下是一…...
【读书笔记】《论语别裁》孝道是这样一个东西
一、内容摘要 本章通过比较人类与其他动物的生存方式,探讨了孝道和人文文化的重要性。作者提到,在自然界中,所有生物都在为自身生存而努力,动物之间的亲子关系如母鸡保护小鸡体现了母性的重要性。虽然人类在外表上与动物无异&…...