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

离线安装 nvidia-docker2(nvidia-container-toolkit) 很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。 阅读详情

基本介绍

  • 适配器模式(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模式最大的作用是将原本不兼容的接口融合在一起工作。

锂电池SOH估计 | 锂电池SOH基础计算与可视化(Python) 阅读详情

相关推荐

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1721

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

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

janeqi1987的专栏 2074

PCB阻焊工艺全解析:从油墨选择到显影测试的完整指南

本文深入解析PCB阻焊工艺全流程,从材料科学角度对比液态光成像(LPI)油墨、干膜阻焊等核心材料特性,系统阐述前处理、涂覆、预烤曝光、显影固化等关键步骤的工艺要点与参数控制。重点探讨了如何通过优化油墨选择与工艺参数,解决常见缺陷,提升PCB的可靠性、美观度及可制造性,为工程师提供从理论到产线实战的完整指南。

s3t4u的博客 553

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

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

仰望者! 227

FAST-LIO2实战:如何在无人机上部署并实现厘米级定位(附ROS配置全流程)

本文详细介绍了如何在无人机上部署FAST-LIO2激光雷达惯性里程计系统,以实现厘米级精确定位。内容涵盖从硬件选型(如激光雷达与机载计算机)、软件环境配置(ROS Noetic)、传感器标定,到FAST-LIO2参数调优、与PX4飞控集成以及实际飞行测试的全流程。重点解决了实时定位中的外参标定、数据同步等关键问题,为无人机在无GPS或复杂光照环境下提供稳定可靠的定位解决方案。

weixin_29062865的博客 250

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 457

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

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

在未来等你的专栏 1292

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 427

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

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

Interview_TC的博客 816

安装Tailscale

如果返回 /usr/bin/tailscale 或类似路径,说明已安装但 sudo 可能找不到它。如果 which tailscale 没有输出,说明安装失败,重新执行安装步骤。Tailscale 的后台服务 tailscaled 必须运行。检查 tailscaled 服务是否运行。检查 tailscale 命令是否存在。

FairLikeSnow的博客 1471

uniapp [全端兼容] - 实现连接蓝牙电子秤+监听数据转换并实时返回示例代码,uniApp实现BLE蓝牙连接多个电子秤设备、蓝牙通讯协议对接详细教程(全平台兼容H5、微信小程序、苹果安卓App)

uniapp连接蓝牙电子秤,uniapp如何连接电子秤蓝牙,蓝牙称重,实现监听数据转换并实时返回,多蓝牙,uni-app电子秤16进制蓝牙通讯协议对接,uniapp微信小程序蓝牙获取电子秤的值,uniapp蓝牙称重电子秤,蓝牙电子秤硬件,APP端连接蓝牙秤获取重量实时显示在页面上蓝牙秤,插件组件,蓝牙连接失败,uniapp安卓苹果ios连接蓝牙电子秤没反应,uniapp微信小程序 蓝牙低功耗连接发送数据监听接收,uni-app小程序蓝牙连接、读写数据全过程,uniapp连接蓝牙体脂秤,蓝牙搜索不到怎么办,如

🏆 前端领域优质创作者 1万+

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

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

dcujcivw769565的博客 175

基于深度学习的树木种类识别

本文介绍了基于深度学习的树木种类识别技术。我们将通过深度学习模型和图像处理技术实现对树木的自动识别与分类。首先,我们将介绍深度学习的基本原理和相关算法。接着,我们将详细说明树木种类识别的数据准备、模型构建和训练过程。最后,我们将给出代码示例,帮助读者深入了解和实践该技术。

一键难忘的博客 2316

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

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

朝阳39的博客 1008

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Adapter(适配器)模式(Java)

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

qq_43287952的博客 276

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_37994110的博客 151

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

适配器模式的实际方面

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、付费专栏及课程。

余额充值