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

基于STM32、HAL库的GZP6816D气压传感器 驱动程序设计 测量范围:0-16kPa(可根据型号不同有变化)工作电压:1.8V-3.6V。高精度:±1% FS。 阅读详情

基本介绍

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

第七节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 用户管理(上) 本节的内容是用户管理,后端Python代码的实现。 阅读详情

相关推荐

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

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

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

janeqi1987的专栏 2074

国内外主流嵌入式GUI汇总

随着MCU资源增多,处理能力也强了,同时市场需求也增多了GUI功能也越来越丰富了,很多的嵌入式图形库都可以做出绚丽的界面。

m0_69914734的博客 3290

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

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

仰望者! 227

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

变色龙哈希函数 Chameleon Hash 可变型区块链

哈希函数 Hash: 众所周知,区块链有着极其优秀的安全性就是因为其充分使用了哈希函数。 哈希简单用一句话来讲,就是:将任意长度输入的字串可转换成一个固定长度的字串,通过原始字串可以很容易地算出转换后的字串,通过转换后的字串很难还原出原始字串。 哈希函数特征: 1. 对于任意m作为输入,得到输出的结果,很难找到另一个输入m'  (m'不等于m),使得m'的Hash结果也为同样的输出

新手村 1万+

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

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

在未来等你的专栏 1292

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 473

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

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

Interview_TC的博客 816

具身智能:原理、算法与系统 第1章 具身智能的本质与范畴

从学术定义的角度,具身智能可被界定为"与物理环境进行有目的的能量与信息交换"的智能形式。这一定义揭示了具身智能的两个本质维度:信息处理维度与能量交互维度。与传统人工智能系统仅在信息空间操作不同,具身智能系统必须同时处理信息流与能量流,在物理约束下实现感知、认知与行动的统一。具身智能体具有三个核心构成要素:物理身体(Physical Body)、感知系统(Sensory System)与效应器(Effectors)。这三者共同构成了感知与行动的基础,使智能体能够通过物理交互而非纯粹符号操作来理解世界。

VectorShift的博客 270

Serial RapidIO Gen2 IP 说明(一)

概述 高速IO(RapidIO)互联架构,用来兼容当前最流行的集成通信处理器、主处理器、联网的数字信号处理器,是一种高性能、分组交换(报文交换)的互联技术。它解决了高性能嵌入式产业稳定性、高带宽以及系统内部更快的总线速率的需求。 高速IO(RapidIO)标准由三层定义:逻辑层、传输层、物理层。逻辑层定义了所有的协议内容和报文格式。这些是终端发起和完成一次传输所必需的信息。传输层提供了报文从一个端点传输到另外一个端点必要的路线信息。物理层则描述了设备级的端口声明,如报...

记录所学,分享知识,结识挚友 1497

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

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

dcujcivw769565的博客 175

Python爬虫实战:手把手教你园林植物分类全维度字典自动化采集实战!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 388

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

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

朝阳39的博客 1008

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Adapter(适配器)模式(Java)

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

qq_43287952的博客 276

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

weixin_37994110的博客 151

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

适配器模式的实际方面

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

余额充值