第二十章、适配器模式

适配器模式是结构型设计模式之中的一个,它在我们的开发中使用率极高,比方ListView、GridView以及RecyclerView都须要使用Adapter。

1.定义

适配器模式把一个类的接口变换成client所期待的还有一种接口,从而使原本因接口不匹配无法在一起工作的两个类能够在一起工作。

2.使用场景

(1)系统须要使用现有的类。但此类的接口不符合系统的须要。即接口不兼容。

(2)想要建立一个能够反复使用的类。用于与一些彼此之间没有太大关联的一些类,包含一些可能在将来引进的类一起工作。

(3)须要一个统一的输出接口,而输入端的类型不可预知。

3.UML类图

适配器模式分为两种,即类适配器模式与对象适配器模式。下面是类适配器的UML图。

(1)Target:目标角色。也就是所期待得到的接口。注意:因为这里讨论的是类适配器模式。因此目标不能够是类。

(2)Adaptee:如今须要适配的接口。

(3)Adapter:适配器角色,也就是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不能够是接口,而必须是详细类。

4.简单实现

以笔记本电源适配器为例,电源适配器将220V的电压转换到5V。

那么5V电压就是Target接口,220V电压就是Adaptee类,转换就是Adapter。

(1)以类适配器模式实现

//Target角色
public interface FiveVolt { public int getVolt5();
}
//Adapter角色
public class Volt220 {
public int getVolt220(){
return 220;
}
}
public class VoltAdapter extends Volt220 implements FiveVolt{

    @Override
public int getVolt5() {
return 5;
} }
public class Test {

    public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter();
System.out.println("输出电压:" + adapter.getVolt5());
} }

结果:

输出电压:5

(2)对象适配器模式实现

对象适配器模式与类适配器模式不同的是。对象适配器模式不是使用继承关系连接到Adapter类,而是使用代理关系连接到Adapter类。

所以FiveVolt 、Volt220 不变。VoltAdapter 改动例如以下:

public class VoltAdapter1 implements FiveVolt{

    Volt220 mVolt220;

    public VoltAdapter1(Volt220 adaptee) {
this.mVolt220 = adaptee;
} public int getVolt220(){
return mVolt220.getVolt220();
} @Override
public int getVolt5() {
return 5;
} }

Test改动为:

public class Test {

    public static void main(String[] args) {
VoltAdapter adapter = new VoltAdapter(new Volt220());
System.out.println("输出电压:" + adapter.getVolt5());
} }

这样的实现方式直接将要适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。这比类适配器方式更为灵活,同一时候被适配对象的方法不会暴露出来。因此对象适配器模式更加灵活、有用。

5.Android源代码中的适配器模式

1.ListView的Adapter

这里ListView的Adapter就是使用的对象适配器模式,Target就是View,Adapter角色就是将Item View输出为View抽象的角色,Adaptee就是须要被处理的Item View。

6.总结

1.长处

(1)更好的复用性:系统须要使用现有的类。而此类的接口不符合系统的须要。那么通过适配器模式就能够让这些功能得到更好的复用。

(2)更好的扩展性:在实现适配器功能的时候,能够调用自己开发的功能,从而自然地扩展系统的功能。

2.缺点

过多的使用适配器,会让系统非常零乱,不易总体进行把握。比方,明明看到调用的是A接口,事实上内部被适配成了B接口的实现,一个系统假设太多出现这样的情况,无异于一场灾难。因此假设不是非常有必要,能够不使用适配器,而是直接对系统进行重构。

7.參考

《JAVA与模式》之适配器模式

《Android源代码设计模式解析与实战》读书笔记(二十)的更多相关文章

  1. 《Android源代码设计模式解析与实战》读书笔记(十七)

    第十七章.中介者模式 中介者模式也称为调解者模式或调停者模式,是一种行为型模式. 1.定义 中介者模式包装了一系列对象相互作用的方式.使得这些对象不必相互明显作用.从而使它们能够松散耦合.当某些对象之 ...

  2. 《Android源代码设计模式解析与实战》读书笔记(十四)

    第十四章.迭代器模式 迭代器模式,又叫做游标模式.是行为型设计模式之中的一个.我们知道对容器对象的訪问必定会涉及遍历算法.我们能够将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现 ...

  3. 《Android源代码设计模式解析与实战》读书笔记(十)

    第十章.解释器模式 解释器模式是一种用的比較少的行为型模式.其提供了一种解释语言的语法或表达式的方式. 可是它的使用场景确实非常广泛,仅仅是由于我们自己非常少回去构造一个语言的文法,所以使用较少. 1 ...

  4. 《Android源代码设计模式解析与实战》读书笔记(十八)

    第十八章.代理模式 代理模式也称托付模式,是结构型设计模式之中的一个.是应用广泛的模式之中的一个. 1.定义 为其它对象提供一种代理以控制对这个对象的訪问. 2.使用场景 当无法或不想直接訪问某个对象 ...

  5. 《Android源代码设计模式解析与实战》读书笔记

    1.定义 将对象组合成树形结构以表示"部分-总体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 2.使用场景 (1)表示对象的部分-总体层次结构时. (2)从一个总体 ...

  6. 《Android源代码设计模式解析与实战》读书笔记(八)

    第八章.状态模式 1.定义 状态模式中的行为是由状态来决定,不同的状态下有不同的行为.当一个对象的内在状态改变时同意改变其行为,这个对象看起来像是改变了其类. 2.使用场景 1.一个对象的行为取决于它 ...

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

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

  8. R语言实战读书笔记(二)创建数据集

    2.2.2 矩阵 matrix(vector,nrow,ncol,byrow,dimnames,char_vector_rownames,char_vector_colnames) 其中: byrow ...

  9. 机器学习实战读书笔记(二)k-近邻算法

    knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...

随机推荐

  1. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

  2. 单链表的增、删、改、减(C++)

    首先是是一个简单的例子,单链表的建立和输出. 程序1.1 #include<iostream> #include<string> using namespace std; st ...

  3. wepy - 与原生有什么不同(slot插槽)

    wepy官方文档是这样介绍的 简单描述就是: index.wpy:子组件 panel.wpy:父组件 1.slot是内容分发的占位符 2.slot父组件在子组件使用时,名称必须一致 3.slot子组件 ...

  4. eclipse安装maven3

    maven3 安装: 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Maven是 Apache 下的一个项目,目前最新版本是 3.0.4,我用的也是这个. 首先去官网下载 Maven ...

  5. position sticky 定位

    1.兼容性 https://caniuse.com/#search=sticky chrome.ios和firefox兼容性良好. 2.使用场景 sticky:粘性.粘性布局. 在屏幕范围内时,元素不 ...

  6. Web 应用性能提升的 10 个建议

    建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...

  7. SVN如何查看修改的文件记录

    主要是有四个命令,svn log用来展示svn 的版本作者.日期.路径等等:svn diff,用来显示特定修改的行级详细信息:svn cat,取得在特定版本的某文件显示在当前屏幕:svn  list, ...

  8. 【Linux】别名

    别名就是一种快捷方式,以省去用户输入一长串命令的麻烦. 别名有多种实现方式,可以使用函数,也可以使用alias命令 注意:alias命令的作用只是短暂的.一旦终端关闭,别名则失效,如果要让别名永久生效 ...

  9. KnockoutJS + My97DatePicker b

    如何将Knockoutjs和其他脚本库结合使用?这里给出一个Knockoutjs与my97datepicker配合使用的例子,例子中使用了ko的自定义绑定功能: ko.bindingHandlers. ...

  10. Linux 调优方案, 修改最大连接数-ulimit

    Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制.下面我把某linux用户的最 ...