工资翻倍篇之适配器模式

先了解一下适配器的基本概念,然后再详细分析一些适配器的样例,最后通过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中的应用的更多相关文章

  1. [Android]GOF23种设计模式 & Android中的设计模式

    GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对 ...

  2. Android中你应该知道的设计模式

    建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...

  3. Android中的Adapter 详解

    http://blog.csdn.net/tianfeng701/article/details/7557819 (一) Adapter介绍 Android是完全遵循MVC模式设计的框架,Activi ...

  4. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式

    断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...

  5. android中常见的设计模式有哪些?

    建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...

  6. Android中的设计模式

    一.设计模式的分类 总体来说23种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式 ...

  7. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  8. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  9. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

随机推荐

  1. 【Java】 剑指offer(1) 找出数组中重复的数字

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...

  2. 【Java】 剑指offer(24) 反转链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头 ...

  3. 018 spark on yarn (Job history)的配置,主要是yarn处跳转到历史聚合页面

    一:目标 1.目标 在yarn的8080页面可以跳转到spark的日志18080页面. 因为在运行spark之后,看对应的job的日志,这样直接连接,更合理直接. 2.总结 在后面可以看到,其实不需要 ...

  4. Environment error: “CodeBloks can't find compiler executable in your configured search path's for GNU GCC compiler”

    codeblock安装后,提示cant find compiler executable in your configured search paths for GNU GCC Compiler 可能 ...

  5. C语言 —— sprintf()函数

    sprintf() 函数 例如: #include<stdio.h> int main() { //注意s一定要先初始化! *sizeof(char)); //或char s[40]; s ...

  6. Spring框架学习04——复杂类型的属性注入

    代码示例如下: 创建BeanClass实体类 public class BeanClass { private String[] arrs;//数组类型 private List<String& ...

  7. Java动态追踪技术探究

    引子 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话: “Debug一下吧.” “线上机器,没开Debug端口.” “看日 ...

  8. MyBatis学习笔记3--使用XML配置SQL映射器

    <resultMap type="Student" id="StudentResult"> <id property="id&quo ...

  9. 【xxl-job】轻松实现分布式定时任务demo实例

    [项目描述]前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以, ...

  10. iptables转发端口

    1.本机端口转发 把发往本机80端口的数据重定向到8080端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-por ...