结构型——适配器模式(Adapter)day07

【安全加固】应对Sweet32攻击:TLS/SSL协议3DES漏洞深度解析与修复指南 本文深度解析了CVE-2016-2183(Sweet32攻击)漏洞,该漏洞利用TLS/SSL协议中3DES加密算法的64位块大小缺陷,通过大量数据流量实施“生日攻击”导致信息泄露。文章提供了从原理分析、系统排查到跨平台修复的完整指南,重点指导如何在Windows、Linux服务器及网络设备中禁用不安全的3DES密码套件,并采用AES-GCM等更安全的加密方式,以彻底修复此TLS/SSL漏洞。 阅读详情

基本介绍

  • 适配器模式(Adapter Pattemn)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。 其别名为包装器(Wrapper)
  • 适配器模式属于结构型模式
  • 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

工作原理

  • 适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容
  • 从用户的角度看不到被适配者,是解耦的
  • 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法
  • 用户收到反馈结果,感觉只是和目标接口交互,如图
    在这里插入图片描述

类的适配器模式

在这里插入图片描述

package cn.adapatee;

public class Adaptee {
	public void sampleOperation1() {
		System.out.println("111111111");
	}
}
package cn.adapatee;

public interface Target {
	void sampleOperation1();
	void sampleOperation2();
}
package cn.adapatee;

public class Adapter extends Adaptee implements Target{
	public void sampleOperation2() {
		System.out.println("2222222222");
	}
}

package cn.adapatee;

public class AdapterClient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * 使用Target时需要用到sampleOperation1,sampleOperation2
		 * 两个方法,而Adaptee只有sampleOperation1这个方法,这时,通过一个Adapter
		 * 继承Adaptee并实现sampleOperation2方法就可以满足Target的两个方法了
		 */
		Target target = null;
		for(int i = 0;i<5 ;i++) {
			target = new Adapter();
			target.sampleOperation1();
			target.sampleOperation2();
		}
	}

}

小结

  • Java是单继承机制,所以类适配器需要继承被适配sre类(Adaptee)这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性;
  • src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
  • 由于其继承了sre类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。

对象的适配器模式

基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承sre类,而是持有sre类的实例,以解决兼容性的问题。即: 持有src类,实现dst类接口,完成src->dst的适配

根据“合成复用原则”,在系统中尽量使用关联关系(聚合)来替代继承关系。
对象适配器模式是适配器模式常用的一种

在这里插入图片描述

package cn.adapatee1;

public class Adaptee1 {
	public void sampleOperation1() {
		System.out.println("111---111---111");
	}
}

package cn.adapatee1;

public interface Target1 {
	void sampleOperation1();
	void sampleOperation2();
}

package cn.adapatee1;

public class Adapter1 implements Target1{

	private Adaptee1 adapter;
	
	public Adapter1(Adaptee1 adapter) {
		super();
		this.adapter = adapter;
	}

	@Override
	public void sampleOperation1() {
		// TODO Auto-generated method stub
		adapter.sampleOperation1();
	}

	@Override
	public void sampleOperation2() {
		// TODO Auto-generated method stub
		System.out.println("222---222---222");
	}
	
}
package cn.adapatee1;

public class AdapterClient1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * 使用Target时需要用到sampleOperation1,sampleOperation2
		 * 两个方法,而Adaptee只有sampleOperation1这个方法,这时,通过一个Adapter
		 * 添加Adaptee属性,构造方法需传入属性值,通过值调用sampleOperation1方法,
		 * 实现sampleOperation2方法就可以满足Target的两个方法了
		 */
		Target1 target = null;
		for(int i = 0;i<5 ;i++) {
			Adaptee1 adaptee = new Adaptee1();
			target = new Adapter1(adaptee);
			target.sampleOperation1();
			target.sampleOperation2();
		}
	}

}

小结

  • 对象适配器和类适配器其实算是同-种思想,只不过实现方式不同。
  • 根据合成复用原则,使用组合替代继承,所以它解决了类适配器必须继承sre的局限性问题,也不再要求dst必须是接口。
  • 使用成本更低,更灵活。

接口的适配器模式

  • 一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。
  • 核心思路: 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。
    适用于一个接口不想使用其所有的方法的情况。

实例

Android中的属性动画ValueAnimator类可以通过addListener(AnimatorListener listener)方法添加监听器,那么常规写法如下:
FF,t_70)
有时候我们不想实现Animator.AnimatorListener接口的全部方法,我们只想监听onAnimationStart,我们会如下写
在这里插入图片描述

AnimatorListenerAdapter类,就是一个接口适配器,代码如下图:它空实现了Animator.AnimatorI istener类(src)的所有方法.
在这里插入图片描述

AnimatorListener是一个接口.
在这里插入图片描述

程序里的匿名内部类就是Listener具体实现类
在这里插入图片描述

案例

在这里插入图片描述

package com.xhl.AdapterInterface;

public interface Interface {
	public void m1();
	public void m2();
	public void m3();
	public void m4();
}

package com.xhl.AdapterInterface;

public abstract class AbsAdapter implements Interface {

	@Override
	public void m1() {
		// TODO Auto-generated method stub

	}

	@Override
	public void m2() {
		// TODO Auto-generated method stub

	}

	@Override
	public void m3() {
		// TODO Auto-generated method stub

	}

	@Override
	public void m4() {
		// TODO Auto-generated method stub

	}

}
package com.xhl.AdapterInterface;

public class AdapterInterfaceDome {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbsAdapter absAdapter = new AbsAdapter() {

			@Override
			public void m3() {
				System.out.println("useing m3.....");
			}
			
		};
		
		absAdapter.m3();
	}

}

适配器模式在SpringMVC框架中的应用

  1. SpringMVC 中的HandlerAdapter, 就使用了适配器模式
  2. SpringMVC 处理请求的流程回顾
    在这里插入图片描述
    3)使用HandlerAdapter的原因分析:可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要调用的时候就得不断是使用ifelse 来进行判断是哪一种子类然后执行。那么如果后面要Controller,
    就得修改原来的代码,这样违背了OCP原则。
  3. 代码分析+Debug源码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

适配器模式总结

类的适配器:以类给到,在Adapter里,就是将src当做类,继承

对象适配器:以对象给到,在Adapter里,将src当做一个对象,持有

接口适配器:以接口给到,在Adapter里,将src当做一个接口,实现

Adapter模式最大的作用是将原本不兼容的接口融合在一起工作。

vue3的面试题 阅读详情

相关推荐

正交试验-方差分析-数据展现形式

方差分析(ANOVA, Analysis of Variance)用于比较多个组之间的均值差异,确定因素对响应变量的显著性影响。示例分析。

m0_58326994的博客 1970

C++设计模式之适配器模式(adapter)(结构型)

一、结构型模式概述 结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 结构型模式可以分为类结构型模式和对象结构型模式: •类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。 ...

janeqi1987的专栏 2074

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1158

深入浅出设计模式七——Adapter模式(结构型)

 将两个不兼容的类或者说没有关系的类纠合在一起使用。就要在使用中间类,这个类即指适配器类。 如:有两种类打方形桩类和打圆形桩类。现在我们即需要打方形桩又需要打圆形桩。那么需要利用继承和组合的特性来创建适配器类。 package com.lwf.object.adapter; public class SquarePeg { public void insert(String st...

仰望者! 227

4.UE数字人工程运行逻辑及程序逻辑

UE数字人工程运行逻辑及程序逻辑

6086

VoLTE吞字断续优化方案

网络侧通过各节点探针的数据采集,能够进行RTP和RTCP包的分析,确定各节点的上行或下行丢包情况。1.基于测试语音分析,每2秒中大约8个字,每个字约10个RTP语音包。通话过程中,语音有短暂停顿,收音段听语音中会出现“吞字/断续现象”2.连续丢3~5个RTP以上就可能会出现吞字断续的感觉。下行评价的丢包问题,很难有效指导定界定位分析,无从下手。2.部分终端可能存在RTCP不反馈,导致无法获取丢包。1.语音包为UDP包,无反馈,终端无法判定是否丢包。终端可依据自身的调度反馈或弃包进行上行丢包判决。

m0_73503557的博客 1512

设计模式精讲 Day 6:适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它通过封装一个已有对象,使其接口与目标接口兼容,从而允许不兼容的类之间进行协作。通过中间层(适配器)将现有类的接口转换为客户端所期望的接口。适配器可以是类适配器(继承方式)或对象适配器(组合方式),具体选择取决于设计需求。// 目标接口:客户端期望的接口// 被适配者:已有接口,与目标接口不兼容System.out.println("播放 VLC 文件: " + fileName);

在未来等你的专栏 1292

UE5网络同步优化:GetLifetimeReplicatedProps高级应用指南

本文深入探讨了UE5中GetLifetimeReplicatedProps函数的高级应用与优化策略。文章超越了基础变量注册,重点阐述了如何通过精细的复制条件控制、频率管理及分层复制机制,构建高效的数据同步通道,从而优化网络带宽与游戏性能,是提升多人游戏体验的实用指南。

weixin_29007243的博客 533

设计模式每日硬核训练 Day 11:适配器模式(Adapter Pattern)完整讲解与实战应用

适配器模式用于将一个已有接口转换为客户所期望的另一个接口,使原本由于接口不兼容而不能一起工作的类能协同工作。“旧接口 + 新系统 = 用适配器来衔接”

Interview_TC的博客 816

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 930

在 SAP BAS 中扩展标准 SAP Fiori 应用并部署到 ABAP 环境的完整实践指南

SAPUI5 Adaptation Project 摘要(148字) SAPUI5 Adaptation Project 提供了一种高效扩展标准Fiori应用的方式,通过创建应用变体(Application Variant)实现差异化定制。开发者可在SAP BAS中使用可视化编辑器修改UI元素(如隐藏字段、调整表格布局、添加按钮等),而无需重写业务逻辑。变体部署到ABAP环境后,可与标准应用并行使用,且能随原应用升级保持同步。典型应用场景包括为不同用户角色定制简化界面或增强特定功能,既满足个性化需求,又保留

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

C#设计模式:适配器模式(Adapter Pattern)

一,Adapter适配器模式是将两个不兼容的类组合在一起使用,如下例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _6.适配器模式 { //保留现有...

dcujcivw769565的博客 175

【XAI】透视深度学习:CNN与Transformer的可解释性方法

深度学习模型的可解释性方法解析:本文探讨了CNN和Transformer两类主流模型的可解释性技术。针对CNN,介绍了显著性图、类激活图(CAM/Grad-CAM)和基于扰动的方法,通过可视化重要像素区域揭示决策依据。对于Transformer,重点分析了注意力机制可视化及其在文本处理中的应用,并介绍了积分梯度等归因方法。文章包含详细的Python实现示例(使用Captum库),涵盖从MNIST图像显著性分析到BERT文本注意力可视化,为初学者提供了可操作的技术指南。这些方法有助于增强模型透明度,提升AI系

u012133341的博客 381

js设计模式【详解】—— 适配器模式

目录 适配器模式的定义 适配器模式——库的适配 适配器模式——参数的适配 适配器模式——数据的适配 适配器模式的定义 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 用途:将无法使用的接口转换成可以使用的接口 使用场景:库的适配、参数的适配、数据的适配 注意事项:适配器模式本质上是一个亡羊补牢的模式,它解决的是现存的两个接口之间不兼容的问题,不应该在软件的初期开发阶段就使用该模式;如果在设计之初就能够

朝阳39的博客 1008

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Adapter(适配器)模式(Java)

Adapter模式 使用场景:原程序无法直接使用,需要适当变化之后才能使用,使用Adapter模式弥补差异 种类: 类适配器模式(使用继承的适配器) 对象适配器模式(使用委托的适配器) 类适配器模式 Banner类 当前实际的类 PrintBanner类 将Banner适配到Print Print接口 Main所调用的 实例 现有一个接口FileIO,声明了将属性集合保存至文件的方法,这个实例中的Banner为java.util.Properties类 FileIO(Print

qq_43287952的博客 276

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

每日JavaScript设计模式:Day 6 适配器模式

适配器模式(adapter) 将一个类(对象)的接口(方法或属性)转化成另外一个接口,以满足用户需求,使类(对象)之间的接口不兼容问题通过适配器得以解决。 简单来说就是通过一个中间的接口,让两个格式不兼容的类/函数/数据等能够相互兼容。举个生活中的例子,mac电脑一般没有dvi接口(就是连台式显示器的接口),只有usb接口,那这个时候我们要连显示器怎么办呢?买一个usb转dvi的转换插头,这样就能...

weixin_37994110的博客 151

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

适配器模式的实际方面

Software development is improved every day by new concepts, methodologies, and high quality libraries and frameworks. But even with all these improvements, we cannot prevent change in software develop...

culi3118的博客 269

适配器模式

适配器模式其实很简单,或者说学了设计模式到现在,虽然每次看到各种名字的设计模式就觉得很高端,但当真正了解过后才知道其实也没有那么玄乎,有的东西在我们平时的时候都已经用到过了。比如这次我们要说的适配器模式,说白了,就是以前的代码接口,和我们客户端需要调用的接口不一致,但以前代码功能又是我们想要的功能。这个时候我们不必去修改以前代码的接口,我们只需要新增加一个类的,这个类符合客户端需要调用的接口,而在...

weixin_33872566的博客 59

设计模式-适配器模式

[size=large][color=red]适配器模式[/color][/size] 分两种:类适配器、对象适配器 [size=medium][b]适配器模式定义:[/b][/size] 把一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。属于结构型模式,需要有Adaptee(被适配者)和Adapter(适配器)两个身份。 [...

edr1991的专栏 151

初涉c#设计模式-Adapter pattern-从CRM功能说起

绝大多数公司都有自己的一个客户管理系统,CRM是公司内部经营的产业链。有时因为部门的不同,赋予每个部门同一个功能的命名也许不同,比如市场部在注册人数上称之为有效人数,而客服部管理中就是想称之为今日注册,当我们考虑代码复用,让class有机工作在一起的时候,就需要考虑Adapter pattern了。 概述:      在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现...

weixin_33895695的博客 109

llama-models 5 分钟上手指南:如何下载并运行 Llama 开源大模型

llama-models 是 Meta 为 Llama 系列开源大模型提供的官方工具包:一个仓库里同时装了模型下载器(llama-model 命令行)、官方推理代码和 FP8/Int4 量化工具。如果你想在本地或自己的 GPU 上跑 Llama 4、Llama 3.2 或更早的版本,这就是从零到跑通的最短路径,适合刚接触大模型部署的新手和想自建推理服务的开发者。 [![llama-models

gitblog_00914的博客 617

go 接口使用(适配器模式)

接口就是一种规范, 只要遵循规范就可以使用其方法做多态操作 使用步骤: 1.在接口中定义方法 2.需要不同的实现 3.统一管理这些实现 以一个负载均衡为例 创建实例(主机)instance.go: package balance import "strconv" /*用于表示主机实例*/ type Instance struct { host string //...

lljxk2008的博客 555

Android在adapter布局里跳转Activity页面,并获取Activity页面数据回调到在适配器的布局中

1.adapter里写一个接口,点击条目时, //点击item到Activity public void chooseUser(CollectSonGoodsAddEntry data); 2.在activity页面中实现adapter接口的方法并赋值, mCollectionSonAdapter = new CollectionSonAdapter(this, mEntryAddList, new CollectionSonAdapter.ICollectionSonListener() {

ShiXinXin_Harbour的博客 1739
上一篇: 排序算法(Sort Algorithm)day02
下一篇: 查找算法(Search Algorithm)day03
哆唻咪à
博客等级 码龄9年 0粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值