适配器模式在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实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
随机推荐
- java:冒泡排序、选择排序、插入排序实现
整数排序 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 样例 样例 1: 输入: [3, 2, 1, 4, 5] 输出: [1, 2, 3, 4, 5] ...
- X分钟速成Python3
参考博客:Python3 从入门到开车 (与以下代码无关) 源代码下载: learnpython3-cn.py Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计. ...
- cookie和session、
https://my.oschina.net/yoyo1987/blog/156117 Session会在浏览器关闭后消失吗? 通常情况下,当我们关闭浏览器再重新打开后,我们就需要再次进行登陆(如果没 ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- Spring 注解@Transactional readOnly=true
引子 今天下班后,以前同事小胖问我Spring Service类中的注解@Transactional readOnly=true的作用.做为他眼中的高人,我自然要装下A-C.居然想都没有想就说是注解 ...
- C语言上机练习二
#include<stdio.h> int main() { int a,b; while(~scanf("%d%d",&a,&b)) printf(& ...
- 硬件篇之MMU
<背景> MMU即内存管理单元(Memory Manage Unit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最大障碍之一.可以说,不懂MMU使很多人一直停 ...
- 2002 ACM 杭电 计算球体积
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2002 注意,要用double 才能过,float过不了. 体积公式要加括号(优先级别)(4 * Π * r ...
- [HDU5685]Problem A
来源: 2016"百度之星" - 资格赛(Astar Round1) 思路: 首先处理出所有前缀的哈希$f$,对于所有的询问$[a,b]$,答案即为$\frac{f[b]}{f[a ...
- javac编译出现需要标识符问题解决
因为没有写public static void mian(String[] args) 在类里面只有属性和方法,内部类.不能直接写System.out.println():