适配器相关知识
-
适配器模式1 动机在软件开发中采用类似于电源适配器的设计和编码技巧通常情况下,客户端可以通过目标类的接口访问它所提供的服务有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作2 模式定义适配器模式(Adapter Patter
-
浅谈Java适配器模式假期刚结束不久,也没什么好写的,今天就水下文章,讲讲设计模式对开发时的影响,做开发到现在,感觉设计模式对开发的影响还是挺大的。这次就简单谈谈适配器模式。可能适配器模式感觉比较鸡肋,但是用到的地方还挺多的,特别是合作开发的时候。1.适配器模式适配器模式,作为连接两个接口的桥梁。这个概念感觉有点那啥,很少用接口的朋友可能就没有什么感觉,经常面向接口编程的朋友比较能产生共鸣,简单来说,就是写一个适配器(转换器)来对接对象。2.适配器模式使用java适配器模式有两种,类适配器和对象适配器(1)类适配器demo类适配器主要是使用继承的方式连接两个接口。我们假设对接接口A和接口B。先写接口Bpublic interface MP4{ void play(); }接口B的实现类public class ExpensiveMP4 implement MP4{ p
-
适配器模式适配器模式 适配器模式主要是用来解决两个已有接口不匹配的问题,使其能够一起工作。 适配接口 比如,公司网站使用的地图一直都是百度地图: 例子: // 百度地图提供的接口 var BaiduMap = { render: function() { console.log("百度地图"); } } // 调用地图的公用方法 function mapShow(map) { map.render(); } // 使用地图 mapShow(BaiduMap); // 输出 百度地图 应项目需要,必须引入高德地图: // 高德地图提供的接口 var Amap = { draw: function()
-
设计模式——适配器模式适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。适配器分类:类适配器模式对象的适配器模式接口的适配器模式注: 如果对类图中的箭头有疑惑参考: UML类图中的六种关系(物理设计阶段)1. 类适配器模式在Adapter中实现目标接口同时继承待适配类来完成适配:Target 为目标接口类Adaptee 为待适配类Adapter 适配器类: 将Adaptee适配为Target接口 // 已存在的、具有特殊功能,但不符合我们既有的标准接口的类class Adaptee { public void specificRequest() { &n
适配器相关课程
-
Android基础教程-SQLite高级操作 本课程主要给大家讲解Sqlite数据库中的查询操作,与数据库相关的数据库的适配器,事务的操作以及数据的分页加载
讲师:Summer321 中级 13610人正在学习
适配器相关教程
- 2. 适配器 所谓适配器组件,其本质就是运用适配器设计模式,匹配不兼容的接口规范。如上图,调用者只能识别接口 2 类型,但是 A 提供的是接口 1 类型。适配器可以把接口 1 转换成接口 2。这样使用者就能使用 A 提供的功能了。为什么要使用适配器组件?欲解答这个问题,则先要了解如果不使用适配器组件,则如何编写用户控制器。既然称为用户控制器,则是开发者根据需要在框架外部定义的一个组件,Spring MVC 不可能未卜先知它的存在。如果要让 Spring MVC 识别这个控制器,有一种方案 :预先定义好接口,强制性要求开发者在设计控制器时遵循接口规范。比如说实现 Controller 接口编写控制器。@Controllerpublic class HelloAction implements org.springframework.web.servlet.mvc.Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { return null;}}除此之外,Spriing MVC 提供有更灵活的用户控制器设计方案,可使用 “ 普通 JAVA 类” 充当控制器,控制器中的方法也可由开发者随性命名。此时,就需要适配器组件把这些不符合规范的控制器以统一的接口方式告诉给 Spring MVC 。Spring MVC 提供了 3 个默认适配器:org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter这些适配对象都实现了 HandlerAdapter 接口,此接口就有一个统一的内部调用方法。@NullableModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;简要描述 3 个适配器的应用场景:SimpleControllerHandlerAdapter: 简单的控制器处理器适配器,支持实现了 Controller 接口的控制器;HttpRequestHandlerAdapter: http 请求处理器适配器,要求编写的控制器时实现 HttpRequestHandler 接口。此类控制器可以很方便的获取请求包中的相关信息。但,真正使用的并不多;RequestMappingHandlerAdapter: 注解处理器适配器,适配使用了注解的用户控制器。本课程中的就是使用了此适配器,此适配器的实现比前两个都复杂。因为有适配器的存在,可以让控制器的设计变得灵活。Tips: 这 3 类适配器都是 Spring MVC 默认提供的,可以不用显示配置,除非有定制需求。
- 适配器模式 适配器在生活中无处不在,比如电脑的转接头、读卡器、电源转接头。他们的共同点就是接口标准不一样,需要通过适配器转换后才能使用。就拿读卡器来说,存储卡的接口只能适配相机或者手机的卡槽。而电脑普遍为 USB 接口。那么如何在电脑上使用存储卡呢?我们可以用读卡器,一头卡槽能够插入存储卡,另一头 USB 可以插在电脑上。通过适配器可以解决接口不兼容的问题。还有个例子就是电脑的变压器,电脑一般接收20V电压,但是我国电压是220V,因此就需要变压器做转换,如下图所示,进来是220V,出来被转为20V。变压器其实就是适配器。
- Android 适配器 Adapter 本节将会引入一个全新的概念——适配器,这个名字很形象,和电源适配器的功能类似,从程序设计的角度出发,它可以将不同类型、不同结构的数据适配到一起。在 Android 中,适配器是 UI 组件和数据之间的桥梁,它帮助我们将数据填充到 UI 组件当中,实现了一个典型的 MVC 模式。我们可以分别编写独立的 UI 样式和数据模型,至于数据如何与 UI 组件绑定都由 Adapter 帮我们完成,这样的好处就是做到 UI 和数据的解耦。Android 系统为我们提供了多种 Adapter,今天就来介绍几种常见同场景下 Adapter 的基本用法。
- 3.2 初始化消息适配器 在 Spring-AMQP 中,我们主要来介绍 MessageListenerAdapter 这一款消息适配器,因为这款消息适配器配置简单,容易上手,初学者在学起来也易于理解。本节以 MessageListenerAdapter 消息适配器为例,主要介绍一下 MessageListenerAdapter 消息适配器在使用之前的操作方法。初始化 MessageListenerAdapter 消息适配器像 RabbitAdmin 和 RabbitTemplate 一样,要想使用消息适配器,需要先对消息适配器进行初始化,这个初始化过程非常简单,初始化 MessageListenerAdapter 消息适配器的代码如下所示:代码实现:// 省略连接 RabbitMQ-Server 的步骤MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());代码解释:1-2 行,我们使用了 new MessageListenerAdapter 的方式,来对 MessageListenerAdapter 消息适配器进行实例化,在实例化的同时,通过向 MessageListenerAdapter 消息适配器的构造方法中传入我们自定义的消息适配器的实现,来将 MessageListenerAdapter 消息适配器进行初始化。其中,MessageAdapter 是我们自定义的消息适配器的实现,这种方式有点类似我们的适配器设计模式,MessageListenerAdapter 消息适配器需要我们传递一个自定义的消息适配器的实现才能完成初始化操作。通过上述两行代码,我们就完成了 MessageListenerAdapter 消息适配器的初始化操作,我们将在下节中为同学们介绍,MessageListenerAdapter 消息适配器中的属性或方法。Tips: 1. MessageListenerAdapter 消息适配器,其全名为消息监听适配器,只不过我们习惯称为消息适配器,其主要目的就是为了代替传统的消息监听方式,即采用消息监听适配的方式来监听消息的变化,从而适配不同的业务场景; 2. 采用消息监听适配器的方式来监听消息并适配不同的业务场景,较采用传统的消息监听处理方法更灵活,代码思路更清晰,且支持复杂业务场景的消息适配处理。 3. 在实际的开发工作中,如果需要对 RabbitMQ 中的消息进行监听,那么我们一般都会选择采用 MessageListenerAdapter 消息监听适配器的方式来处理,很少会采用传统的消息监听方式来处理。
- 3.2 GridView 适配器 以上属性都在 25.2.1 小节有描述,也比较好理解,接着修改 MyAdapter 类,它是继承自 BaseAdapter 实现的自定义适配器,因为二维列表更节省空间,上一节的水果数目已经没法占满一屏,这样会导致列表不能滑动,不利于体验 GridView 的效果。为此有两种解决方法:一个是我们可以手动扩展我们的列表数组,增加一些水果名称和图片;第二种方法是直接修改适配器,不断地循环从之前的列表中取水果数据。为了让大家更好的理解适配器的原理,我们采用第二种方法来扩展列表,我们需要修改两个回调方法:getCount和getView。getCount 表示列表的总 item 数,我们直接将水果列表长度乘以10: @Override public int getCount() { return mName.length * 10; }getView 中我们完成 View 和数据的绑定,我们需要循环取数,所以只需要将 item 的位置对数组大小取模即可:@Override public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view, null); TextView name = convertView.findViewById(R.id.textView); ImageView image = convertView.findViewById(R.id.imageView); // item 的位置对数组长度取模,实现循环取值 name.setText(mName[position % mName.length]); image.setImageResource(mResId[position % mResId.length]); return convertView; }完整的 MyAdapter 代码如下:package com.emercy.myapplication;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter { private Context mContext; private String[] mName; private int[] mResId; public MyAdapter(Context context) { mContext = context; } public void setData(String[] name, int[] resId) { mName = name; mResId = resId; } @Override public int getCount() { return mName.length * 10; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view, null); TextView name = convertView.findViewById(R.id.textView); ImageView image = convertView.findViewById(R.id.imageView); name.setText(mName[position % mName.length]); image.setImageResource(mResId[position % mResId.length]); return convertView; }}
- 3. 适配器模式适用场景 想要使用一个已有的类,但是此类的接口并不符合使用方要;多个类做的事情相同或者类似,但是各自接口又不同。调用方希望统一接口。第一个场景可以认为是亡羊补牢。由于种种原因造成系统接口不同,但功能却类似。此时很可能我们不能直接修改已经存在的接口,我们只能通过适配器模式去适配这个接口。第二个场景其实也很常见。比如我们开发一个比价网站,需要从不同网站抓取同类商品的价格,然后按照自己系统的数据结构保存。不同网站抓取到的数据肯定是不同的,可能字段名不一样,也可能数据结构都不同。但是最终都要保存为同样的数据结构,此时就需要适配器来做转换。
适配器相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议