适配器模式在Android中的应用
工资翻倍篇之适配器模式
先了解一下适配器的基本概念,然后再详细分析一些适配器的样例,最后通过Android开发中经常使用的适配器模式进行分析,保证对适配器模式理解透彻。
1、适配器的基本概念
1.1类适配器模式
说明:
当新接口出现的时候,因为和老的接口不兼容,这个时候,我们採用一个适配器类实现新的接口而且继承老的业务类,这样就能同一时候处理新老业务。
演示样例代码:
1.2对象适配器模式
说明:当新接口出现的时候。因为和老的接口不兼容,这个时候。我们採用一个适配器类实现新的接口并在内部持有一个老业务逻辑的对象,这样就能把对老接口的调用所有中转给老的业务逻辑,从而解决接口的兼容性问题
演示样例代码:
1.3接口适配器模式
说明:也叫缺省适配器模式,主要解决接口的复用问题:有时候可能我们的业务仅仅须要使用接口中的某一个方法而不是所有方法。可是因为接口的语言特性而 不得不实现所有的抽象方法。这样就会使得接口的使用过程非常麻烦,特别是接口中存在非常多抽象方法的时候。面对接口的这类问题。我们能够採用一个抽象类(也可 以不是抽象类)去实现接口。然后让我们的类去继承这个抽象类同一时候仅仅重写我们感兴趣的方法就可以。
2、类的适配器和对象适配器的分析
2.1类的适配器
如上图,当我们的Client须要一个新功能的时候。我们定义了一个RequiredInterface,里面有我们须要实现的方法requiredMethod(),
刚好这个requiredMethod()须要的功能已经在ExistingClass中实现了,ExistingClass是已经存在的一个类,里面有我们须要的方法usefulMethod()。这个时候,我们要做的就是创建一个NewClass新类,让他继承自ExistingClass,然后实现RequiredMethod,重写requiredMethod,将usefulMethod()的逻辑委派为requiredMethod,这样就实现了接口的适配了。
类适配器样例
火箭公司有一个火箭仿真事件EventSim,里面有非常多仿真的火箭RocketSim。RocketSim是一个接口,想要增加EventSim的火箭都必需要实现RocketSim接口。
如今有一款火箭PhysicalRocket。这款火箭提供的功能和RocketSim相似。我们须要把这款火箭放到火箭仿真功能EventSim中,这个时候我们能够运用适配器模式,创建一个新的OozinozRocket继承PhysicalRocket同一时候实现RocketSim类。
新的rocket就同一时候具有PhysicalRocket的属性和仿真属性了。
同一时候我们须要将PhysicalRocket中的功能getBurnTme,getMass,getThrust委派给新的OozinozRocket的getMass,getThrust。
这样一来OozinozRocket就能放到仿真功能EventSim中了。
以上就是类的适配器。通过子类进行适配。 在类的适配器中。新的适配类OozinozRocket实现了须要的接口RocketSim,并继承了现有的类PhysicalRocket。
当你须要适配的一组方法并不是被定义在接口中时,这样的方法就不奏效了。此时须要创建一个对象适配器,它使用了委派并不是继承。
2.2对象适配器
和上面的类的适配器进行比較能够发现,类的适配器中须要的是一个接口RequiredInterface,而对象适配器中须要的是一个类RequiredClass。
这个时候就不能使用类的适配器了,而须要使用对象适配器。
这里的NewClass是对象适配器的样例,NewClass实现了RequiredClass。这样就满足了client的须要,同一时候NewClass和ExistingClass是关联关系。ExistingClass是NewClass中的一个成员变量。
对象适配器样例
样例和上面类的适配器相似,只是多赘述
这里的仿真事件中须要的不再是接口。而是一个Skyrocket类。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
我们的对象适配类OozinozSkyrocket实现了Skyrocket,内部并持有一个PhysicalRocket。由于子类仅仅能继承一个父类。所以OozinozSkyrocket想要具有PhysicalRocket的功能就必须持有一个PhysicalRocket对象,然后将须要的功能委派给OozinozSkyrocket。
初始化的时候须要传入一个PhysicalRocket对象对内部持有的PhysicalRocket进行初始化。
如此就将PhysicalRocket通过OozinozSkyrocket适配类适配成须要的Skyrocket类了。所以适配器的目的就是将一个类适配成须要的一个类。
如今再来看开头的一些概念,就会认为清晰非常多了。
可能你另一点模糊,可是你的功底已经练得差点儿相同了,只是就仅仅差打通任督二脉的那一股劲了。
我们来看看android开发中我们常遇到的适配器模式。你就会豁然开朗了。
3、Android中的适配器模式
在开发android程序时。我们用到最多的适配器模式就是写listView的时候经常使用到的BaseAdapter。
ListView控件大家再熟悉只是了。要想将一组数据显示到listView上,就必需要新建一个MyAdapter继承自BaseAdapter,然后
listView.setAdapter(myAdapter);将我们的数据设置到listView控件上进行显示。
所以我们必须将我们须要显示的一组数据适配成BaseAdapter,我们新建一个MyAdapter继承自须要的类BaseAdapter,然后内部持有我们须要显示的数据,这是典型的对象适配器。
android中的ListView控件,在显示listView列表的时候,并非将每一组数据都硬塞给控件,而是定义了ListAdapter接口,ListView的实现使用了ListAdapter接口。我们的BaseAdapter实现了ListAdapter。然后我们提供了一个适配器,将数据转换为BaseAdapter。
不仅是Android的ListView,Swing提供的显示列表的空间JTable也是用到了对象适配器。
适配器模式在Android中的应用的更多相关文章
- [Android]GOF23种设计模式 & Android中的设计模式
GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对 ...
- Android中你应该知道的设计模式
建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...
- Android中的Adapter 详解
http://blog.csdn.net/tianfeng701/article/details/7557819 (一) Adapter介绍 Android是完全遵循MVC模式设计的框架,Activi ...
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
- android中常见的设计模式有哪些?
建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...
- Android中的设计模式
一.设计模式的分类 总体来说23种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式 ...
- Android中的LinearLayout布局
LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了, 线性布局是按照垂直方向(vertical)或水平方向 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
随机推荐
- sublime断点调试
系统重装了之后以前装好的zendstudio的xDebug又不能用了 搞了一天,放弃了 看到sublime也能调试,我就用sublime了 首先要下sublime插件 链接:http://pan.ba ...
- zend studio调试
XDdebug搞了我一天 先把php.ini的代码发一下 [XDebug] zend_extension = "d:/WAMP/wamp/bin/php/php5.5.12/zend_ext ...
- [SDOI2012]象棋
题解: sd的题目也真是奇怪 第一题有了最短路第二题还有 第二题有了网络流第三题还有 显然是可以网络流的 但考虑每个点只能存在一个这个条件 刚开始我以为是建分层图..但发现这个时间复杂度太高了 其实我 ...
- 解决Linux下Qt编译出现"cannot find -lGL"以及无法安装libgl1-mesa-dev的问题
在Linux系统下安装好Qt5,打开Qt Creator新建一个最简单的工程,编译却出现"cannot find -lGL"错误. 在网上搜索解决方法,找到的方案基本上是安装lib ...
- asp.net core2.0大白话带你入门
本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期9.session的使用10.cookie的使 ...
- 51Nod 算法马拉松28 C题 栈 单调队列
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 51Nod1952 题意概括 有一个栈,有3种操作: Ο 从栈顶加入一个元素 Ο 从栈底加入一个元素 Ο 从栈 ...
- Android系统下用js自定义gesture事件(仿ios实现移动端事件一致)
.katex { display: inline-block; text-align: initial; } .katex { font-family: Consolas, Inconsolata, ...
- js时间戳转换时间、距当前时间
// 1.时间戳转化成时间格式 function getTime(times) { return new Date(parseInt(times) * 1000).toLocaleString().r ...
- 连接池commons-pool2
commons-pool2池技术可以应用在对象上构建对象池,也可以用在http连接或者netty连接 构建连接池,池技术为了节省对象创建销毁或连接资源频繁申请销毁带来的时间消费. 当用于连接池在进行扩 ...
- 10.23 正睿停课训练 Day7
目录 2018.10.23 正睿停课训练 Day7 A 矩形(组合) B 翻转(思路) C 求和(思路 三元环计数) 考试代码 B1 B2 C 2018.10.23 正睿停课训练 Day7 期望得分: ...