适配器模式定义:

把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器的使用场景:

1、系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3、需要一个统一的输出接口,而输入端的类型不可预知。

总结:输入不可预知,但是输出是规定好的。
比如:
不管输入的是多少伏的电压,输出的必须是5V。
不管用户的item布局样式是什么,listview使用的item都是view类型。

代码示例:
系统只提供给我们苹果汁,而我们需要的是加了糖的苹果汁,所以无法直接使用系统的原料,这就是接口不兼容,此时我们就需要用适配器来做一个接口的转换。把苹果汁转换成加了糖的苹果汁。

1、类适配器模式(不够灵活,仅做介绍,不建议使用)

/*** 系统提供给我们的苹果汁*/
public class AppleJuice {public String getAppleJuice() {return "苹果汁";}public void doSomething() {//系统制作苹果汁的其它神奇操作}
}
/*** 使用类适配器模式需要继承被适配对象*/
public class JuiceAdapter extends AppleJuice {@Overridepublic String getAppleJuice() {//经过一系列复杂的惨无人道的工序//我们给苹果汁加上了糖return "加上了糖的" + super.getAppleJuice();}@Overridepublic void doSomething() {super.doSomething();}}

我们用JuiceAdapter继承了AppleJuice,并返回了经过加工后符合输出要求的加了糖的苹果汁。
执行代码:

                JuiceAdapter adapter = new JuiceAdapter();String juice = adapter.getAppleJuice();Log.i("LHD", "给我一杯" + juice);

输出结果:

是不是看起来很简单?是的,适配器模式的本质就是对接口的转换。
接下来我们看看对象适配器模式。

2、对象适配器模式
/*** 苹果汁接口*/
public interface FruitJuice {String getFruitJuice();
}
/*** 系统提供给我们的苹果汁*/
public class AppleJuice {public String getAppleJuice() {return "苹果汁";}public void doSomething() {//系统制作苹果汁的其它神奇操作}
}
/*** 对象适配器模式*/
public class NewFruitJuiceAdapter implements FruitJuice {AppleJuice appleJuice;public NewFruitJuiceAdapter(AppleJuice appleJuice) {this.appleJuice = appleJuice;}@Overridepublic String getFruitJuice() {String juice = appleJuice.getAppleJuice();//经过一系列逆天的操作//得到一杯加了糖的苹果汁return "加了糖的" + juice;}}

执行代码:

AppleJuice appleJuice = new AppleJuice();
NewFruitJuiceAdapter newFruitJuiceAdapter = new NewFruitJuiceAdapter(appleJuice);
String newJuice = newFruitJuiceAdapter.getFruitJuice();
Log.i("LHD", "给我一杯" + newJuice);

输出:

可以看到我们在适配器内部持有了一个系统提供的苹果汁对象的引用,然后实现了FruitJuice接口,并在getFruitJuice方法中返回了需要输出的苹果汁。

所以可以看到对象适配器模式就是在适配器内部持有输入接口的引用,经过一系列变化,把输入的接口转换成需要的目标接口。

这种实现方式需要将被是配的对象传入到adapter中,使用组合的方式实现接口的兼容,这种方式比类适配器更加灵活,它的另一个好处是被适配对象中的方法不会暴露出来,而类适配器由于继承了被适配的对象,因此,被适配对象类的函数在adaper中也含有,这就会让adapter类出现一些奇怪的接口,比如你可以直接调用doSomething方法,会更难维护,也会让用户的使用成本变高。

适配器模式的典型应用就是Listview,RecyclerView的Adapter啦,大家可自行阅读源码,此处不再赘述。

以上就是适配器模式的简单介绍啦! (#^ . ^#)

java常用设计模式11—适配器模式相关推荐

  1. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  2. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

  3. 初学Java常用设计模式之——装饰器模式

    声明:转载请附上原文链接 提示:标题序号从8开始,是照应不同设计模式笔记发布的顺序而定的,比如,上一篇文章 初学Java常用设计模式之--桥接模式和组合模式 序号从7开始. 8. 装饰器设计模式(重点 ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. java常用设计模式文章收集

    java常用设计模式文章收集 java设计模式--接口模式 java设计模式--抽象工厂模式 java设计模式--工厂模式 Java设计模式--迭代器模式 Java设计模式--原型模式 JAVA设计模 ...

  6. Java常用设计模式————适配器模式

    引言 由于无法直接使用某个类中的方法而采取的一种中间类转换的策略.将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容. 适配器模式可以分为三种:类适配器.对象适配器.接口适配器.它们之间的区 ...

  7. Java常用设计模式————工厂模式

    简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

  8. java常用设计模式 看了她,改变你的一生~~~

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  9. 初学Java常用设计模式之——单例模式

    0. 常⻅的三⼤设计模式分类 创建型模式:提供了⼀种在创建对象的同时隐藏创建逻辑的⽅式,使 得程序在判断针对某个给定实例需要创建哪些对象时更 加灵活,比如: 常用4个:⼯⼚模式.抽象⼯⼚模式.单例模式 ...

最新文章

  1. PAT——个位数统计(1021)
  2. js里的面向对象分析-(创建实例化对象)
  3. 重启计算机后桌面顺序是反的,Win10系统为什么重启电脑之后桌面上的图标排列顺序被打乱该如何处理...
  4. 小程序日历插件的使用
  5. 在排序数组中,找出给定数字的出现次数
  6. 北京大学软件与微电子学院嵌入式系统工程系
  7. 1838公共政策概论
  8. 【分享】5s管理之实现仓库有效管理的7个步骤
  9. css 实现一个尖角_css3如何做尖角标签效果?
  10. 张家界航空工业职业学院计算机,张家界航空工业职业技术学院2021年招生代码...
  11. 机器学习之信用卡诈骗案例总结
  12. 五线谱入门,程序员也可以玩音乐
  13. vue 音乐进度条拖拽
  14. 数据结构概述3 对称矩阵、树和二叉树
  15. 海康硬盘录像机无法通过rtsp协议连接到EasyNVR的Web页面如何处理?
  16. linux课程班兰州,兰州云计算培训,兰州计算机培训班,兰州计算机培训哪家比较好...
  17. HTML小游戏14 —— H5横版冒险游戏《无限生机》(附完整源码)
  18. 实习 | QQ音乐(深圳)娱乐营销实习生
  19. Vue 开发环境搭建(Mac 版)
  20. Educational Codeforces Round 104 (Rated for Div. 2)A-E题解

热门文章

  1. 以游戏玩家的视角开启设计模式
  2. java.lang.IllegalArgumentException: Last encoded character (before the paddings if any)
  3. 【哈利波特】Sherbert Lemon对HP的解读之10
  4. R语言按照人口比例绘制甘肃地图
  5. 绑定小程序数据助手,查看小程序的统计数据-微信小程序开发-视频教程22
  6. Fuzzy set基本介绍(1)
  7. 红孩儿编辑器的模块设计13
  8. 软件测试常用的性能测试指标,7个常用的网络性能测试指标
  9. 「学IT一定要看」一些学习的建议
  10. 鸿蒙定时重启软件,谁有自动定时关机开机的软件!求助!