[DP]Adapter设计模式

自定义View-使用Adapter设计模式打造流式布局 概述 最近在写公司项目需求,有一个流式布局FlowLayout需要进行修改,这个一般用于显示标签信息,看了一下之前的代码,感觉可拓展性太差,要实现这次的效果,有点麻烦,索性自己打造一个流式布局,这次决定像ListView,RecycleView一样,采用Adapter设计模式进行实现,这样具体对某个子View进行修改的话,可以直接在Adapter中进行修改。 效果 分析 1.继承自谁?我们可以看到内部包含许多View,因此这是一个自定义ViewGroup 2.测量 onMeasure(),这里我们需要知道 阅读详情

Adapter:适配器

Adapter设计模式正如名字所说的,起着适配器的作用。交流电供应220V,但是我们手机充电需要直流5V,这个时候适配器就起作用了,将电源供应转换成能够被我们手机所使用的伏特。

至此我们明白适配器模式的意图

意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


适用性:

以下情况使用Adapter模式:
1 • 你想使用一个已经存在的类,而它的接口不符合你的需求。
2 • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3 •(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。即仅仅引入一个对象,并不需要额外的指针以间接取得adaptee。


适配器的种类:

共有两类适配器模式:1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现)
1)类适配器模式 
   ——适配器继承自已实现的类(一般多重继承)。
Adapter与Adaptee是继承关系
1、用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
2、使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
3、仅仅引入一个对象,并不需要额外的指针以间接取得adaptee
2)对象适配器模式—— 适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。


Adapter与Adaptee是委托关系
1、允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
2、使用重定义Adaptee的行为比较困难
无论哪种适配器,它的宗旨都是:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
即在不改变原有系统的基础上,提供新的接口服务。


结构:

类适配器:


类适配器使用多重继承对一个接口与另一个接口进行匹配。


对象适配器:


对象匹配器依赖于对象组合


构建模式的组成
•目标角色(Target):— 定义Client使用的与特定领域相关的接口。
• 客户角色(Client):与符合Target接口的对象协同。
• 被适配角色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。
• 适配器角色(Adapte) :适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口。对Adaptee的接口与Target接口进行适配.





talk is cheap, show me the code:

假设我们有一个随机数组生成器,但我们的客户角色要使用二分搜索一个随机数组。

二分搜索的前提是数组是有序的,这个时候我们的随机数组生成器似乎排不上用场了。

我们也许可以自己再写一个有序随机数组生成器,但是既然我们有现成的随机数组生成器,为什么不稍微改进一下,使其能够产生有序随机数组呢?

随机数组生成器:(被适配角色)

class UnorderedRandomNumberArrayGenerator {
	public int[] generateRandomSequence() {
		int len = (int) (Math.random() * 20) + 1;
		int[] arr = new int[len];
		for (int i = 0; i < len; i++) {
			arr[i] = (int) (Math.random() * 100);
		}
		return arr;
	}
}
对于类适配器来说,我们要继承被适配的对象,然后实现目标角色的接口。

目标角色接口:

interface OrderedSequenceAdapter {
	public int[] generateOrderedSequence();

}

类适配器:

class OrderedRandomNumberArrayGenerator extends UnorderedRandomNumberArrayGenerator implements OrderedSequenceAdapter {
	@Override
	public int[] generateOrderedSequence() {
		int[] arr = generateRandomSequence();
		Arrays.sort(arr);
		return arr;
	}
}



而我们的对象适配器则是通过持有被适配角色:

class OrderedRandomNumberArrayGenerator implements OrderedSequenceAdapter {
	private UnorderedRandomNumberArrayGenerator randomNumberArrayGenerator = null;

	public OrderedRandomNumberArrayGenerator(UnorderedRandomNumberArrayGenerator randomNumberArrayGenerator) {
		this.randomNumberArrayGenerator = randomNumberArrayGenerator;
	}

	@Override
	public int[] generateOrderedSequence() {
		int[] arr = randomNumberArrayGenerator.generateRandomSequence();
		Arrays.sort(arr);
		return arr;
	}
}




对于适配器模式,适配器模式只是将原来的接口进行一些调整,使的不兼容的接口能够兼容,他并不会增加新的功能。

在上述随机数组发生器中,被适配类 产生的是无序随机数组,而适配器产生的则是有序随机数组,本质上都是产生随机数组,对于功能上并没有增加。




spring aop框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型,上述三种通知类型是spring aop框架定义的,它们是aop联盟定义的Advice的子类型。

public interface AdvisorAdapter {
	// 将一个Advisor适配成MethodInterceptor
	MethodInterceptor getInterceptor(Advisor advisor);
	// 判断此适配器是否支持特定的Advice
	boolean supportsAdvice(Advice advice);
}

这个接口允许扩展spring aop框架,以便处理新的Advice或Advisor类型,其实现对象可以把某些特定的Advice类型适配成AOP联盟定义的MethodInterceptor,并在spring aop框架中启用这些通知类型。通常spring用户不需要实现这个接口,除非想把更多的Advice和Advisor引入到spring中时。
spring aop框架本身为这个接口提供了很好的实现,例如为了支持MethodBeforeAdivce、AfterReturningAdvice、以及ThrowsAdvice这三种通知类型,spring在org.springframework.aop.framework.adapter包中分别为它们定义了相应的适配器,在此仅以AfterReturningAdviceAdapter为例

class AfterReturningAdviceAdapter implements AdvisorAdaptor, Serializable {
	// 此适配器仅支持AfterReturningAdivce类型
	public boolean supportsAdvice(Advice advice) {
		return advice instanceof AfterReturningAdivce;
	}
	// 把特定的Advisor适配成MethodInterceptor
	public MethodInterceptor getInterceptor(Advisor advisor) {
		AfterReturningAdivce advice = (AfterReturningAdivce) advisor.getAdvice();
		return new AfterReturningAdviceInterceptor(advice);
	}
}






以阿克曼转向车为例对URDF和XACRO文件进行解读    最近我在古月学院购买了在Gazebo中实现阿克曼转向车的仿真课程,课程资料的阿克曼小车的XACRO文件在Gazebo里加载的时候报了三个错误,在这之前,我没接触过URDF或XACRO文件,本篇文章就以这个阿克曼小车的XACRO文件为例,对URDF或XACRO文件的格式和内容进行解读,期望经过解读和学习,找到错误原因及所在,并解决这三个错误    先来放一下上面右图所示的模型的完整的XACRO文件: <?xml version="1.0"?> <!-- racecar.urdf.x 阅读详情

相关推荐

Comfy UI实战:如何用Checkpoint和Lora打造超写实人像(附完整工作流)

本文详细介绍了如何利用Comfy UI结合Checkpoint基础模型和Lora微调模型,打造超写实人像生成系统。从核心模型选择、工作流架构设计到提示词工程和参数优化,提供了一套完整的实战指南,帮助创作者提升AI绘画的专业水准和效率。

weixin_29032489的博客 459

.NET设计模式(8):适配器模式(Adapter Pattern)

  适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。 ...

weixin_33836223的博客 300

从Multibit到Debanking:芯片设计中的时序优化完整流程解析(含真实案例)

本文深入解析芯片设计中Multibit技术与Debanking的时序优化完整流程,结合7nm移动SoC真实案例,详细探讨Multibit的核心优势、实施条件及潜在风险,并提供Debanking的触发时机与操作策略。通过平衡Multibit与Debanking,工程师可有效优化PPA(Power-Performance-Area),提升芯片设计效率。

weixin_30316097的博客 460

分布式训练(中)——DP、DDP模式

1、在DP中,每个GPU上都拷贝一份完整的模型,每个GPU上处理batch的一部分数据,所有GPU算出来的梯度进行累加后,再传回各GPU用于更新参数2、DP多采用参数服务器这一编程框架,一般由若个计算Worker和1个梯度聚合Server组成。Server与每个Worker通讯,Worker间并不通讯。因此Server承担了系统所有的通讯压力。基于此DP常用于单机多卡场景。

xiaoyuer的博客 4502

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间

lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很...

weixin_39669629的博客 1万+

动态刷新曲线_【GhPython应用】利用反射刷新Image sampler组件

【版权声明】| 作者:月之眼|案例图片来源:Sergiu Radu Pop的facebook| 如有侵权,请联系大水牛平台|如果觉得文章不错,欢迎分享效果展示利用python刷新Image sampler组件,主要的思路就是X输入端:输入要切换的图片路径,我的案例中输入了9张图片。然后通过100毫秒切换一张图片显示,来达到动态显示效果。代码分析run输入端类型:bool (I...

weixin_42393829的博客 531

dp模式是什么意思_DP的完整形式是什么?

dp模式是什么意思 DP:显示图片 (DP: Display Picture) DP is an abbreviation of the Display Picture. It is also called a profile picture. It denotes a picture which is in commonly used as a display picture by upload...

cumtv80668的专栏 1万+

AIOps探索 | 如何用大模型构建高效运维知识及智能问答平台(1)

好久没有分享AIOps相关干货了,最近大模型这么火,而且我们有客户已经基于大模型构建了知识及智能问答平台,需要在运维领域结合使用场景进行应用。为此,楼主从头到尾声梳理了一遍大模型在运维领域构建知识及智能问答平台的应用场景、技术实现,总结出来供大家一同探索,希望对大家理解和运用大模型有一定帮助~

智能运维及数据中台探索 2809

.NET设计模式(14):代理模式(Proxy Pattern)

代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。这就是本文要说的Proxy模式。   主要内容 1.例说Pr...

weixin_34255793的博客 259

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 604

uniapp [全端兼容] - 实现接入集成高德地图搜索地址及选择位置功能,搜索框检索选择地点并返回经纬度及详细省市区县街道地址,用户搜索历史及清空历史记录,选择地址自动获取周边位置列表/地图移动选点

uni-app,高德地图,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp高德地图,在地图上选择或搜索指定地点,打开地图选择位置,关联地址搜索,输入地址返回附近地址列表,uniApp高德地图地址搜索,搜索框历史记录,关键字搜索,周边查询,搜索位置,uniapp对接高德实现搜索出现地址以及保存搜索记录,集成高德地图,实现精准位置选点功能,获取当前定位城市,如何实现搜索功能,获取省份城市区街道详细地址经纬度,移动选点标记位置,在地图上进行选择位置选点、搜索

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

设计模式(Design Pattern,DP)

文章目录设计模式的产生背景1、 设计模式的六大设计原则1.1 开闭原则:Open Closed Principle,OCP1.1.1 开闭原则的定义1.1.2 开闭原则的作用1.2 单一职责原则:Single responsibility principle,SRP1.2 .2 单一职责原则的优点1.3 里氏替换原则:Liskov Substitution Principle,LSP1.3.1 里氏替换原则的定义1.3.2 里氏替换原则的作用 设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计

weixin_45753248的博客 3249

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

设计模式的比喻

着楼主的帖子,在心里把GOF DP又过了一遍,感觉这种方式来学习DP很可取,不拘泥于具体而着重于思想。里面的一些内容个人觉得有些地方不太恰当,提出来供参考:创建型模式1、FACTORY—人才市场:以往是要哪个人才,就找哪个人才,效率低,现在有了人才市场,我们只需直接去人才市场挑一个好了;--人市换成猎头公司如何? 2、BUILDER—生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一

§为艺术而技术§ 1255

WINCC7.3破解文件

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

jre9下载 jdk9

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

设计模式之6 桥接模式和adapter模式

1.    桥接模式就是bridge模式。 简单的来说,就是一个类如果想往两个维度扩展,就用耦合来代替继承关系,进行排列组合。   所谓耦合就是在一个类当中持有另外一个类的对象。 通过耦合和继承相结合,就可以排列组合出各种情况。 Bridge模式是为了解决类的层次和结构过于复杂的问题,而提出的。     类与类的关系: 1.      如果一个类的对象是另外一个类的成员变量,表示

utnewbear的专栏 777

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

GOF经典设计模式 - Adapter 适配器模式

GOF经典设计模式 - Adapter 适配器模式GOF Design Pattern定义类图代码示例应用场景 GOF Design Pattern定义 将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工的那些类可以一起工作。[DP] 类图 代码示例 目标接口、返回值 public interface Target { TargetRes...

老齐 381

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Adapter的notifyDataSetChange无效的问题

前段时间遇到一个问题,那就是在Activity中通过构造函数实例化自定义Adapter并setAdapter()后,再修改传递数据源赋值,后调用notifyDataSetChange()方法,然并卵的问题!看了很久的源码觉得想从观察者模式入手搞清楚这是为什么?

XuZhenhao 6980

设计模式之Adapter模式

作用:使不同的类之间进行协调配合(220V的电压经过适配器给12V的电脑供电) Adapt模式有以下两种: 1.类适配器模式(使用继承的适配器) UML类图: Banner类: public class Banner //220伏电压 { private String string; public Banner(String s...

aishenyan0793的博客 274

第3组UI(1)-AdapterView之ListView及MVC设计模式

一列表视图ListView ArrayAdapter-ListView 简单用法 SimpleAdapter-ListView 定制listview界面 ListView的点击事件 二MVC设计模式以及Adapter接口及实现类 MVC设计模式 Adapter接口及实现类 1概述 2具体实例在一种可见 三定制ListView界面的改进改善耗内存 改善耗时 list子项获取不到点击事件 小细节 增强功

womengmengyan的博客 1650

Android UI设计——ListView控件和自定义Adapter(四)

自定义Adapter   这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步骤:    One.自定义的Adapter依然遵循MVC设计模式,首先我们来创建数据Model。   创建一个学生类:public class Student { /* 定义学生的构

To_be_Designer 1万+

Android快速开发之Adapter

原文地址:http://blog.youkuaiyun.com/lmj623565791/article/details/38902805 1、概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseAdapter复写几

weishiwei0923的专栏 427

Java:设计模式之适配器Adapter(续)

Java:设计模式之适配器模式Adapter 1.默认(缺省)适配器: 缺省适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。作为适配器模式的一个特例,缺省是适配模式在JAVA语言中有着特殊的应用。 如果只是对接口的一部分感兴趣,采用默认适配器比较合适。 这样可以只针对这部分感兴趣的方法重新实现,而

混迹于移动互联网和手机行业 1198

Android UI 设计(10):ListView 控件和自定义 Adapter(四)

自定义Adapter 这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步骤: One.自定义的Adapter依然遵循MVC设计模式,首先我们来创建数据Model。 创建一个学生类: public c

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 502

七、设计模式之适配器模式【Adapter】

适配器模式请不要在开发设计阶段使用。它通常是作为已存在系统不符合我们新的接口定义时,通过适配器进行转换复用。所以我们必须满足 依赖导致和里式替换原则(即:面向高层开发)。不然后后续导致很多适配器的改造。因而,适配器模式是一个补偿模式,为了解决接口不匹配问题而存在。多说一句: 在软件架构中。适配器模型多和门面模式(外观模式)配置使用,组成防腐层。用来解藕服务间和模块间依赖问题。

寓教于乐。教己助人 149

DP-适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。 意图...

weixin_30470857的博客 185

基于Android的开发项目中Adapter的用法

如何使用适配器

m0_61632590的博客 1149
上一篇: [DP]Singleton设计模式
下一篇: [DP]Bridge设计模式
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值