前言

在Android开发中,我们会经常遇到ListAdapter、RecyclerViewAdapter等带有Adapter字样的类,其实这里就用到了适配器模式,由于适配器模式的使用频率极高,因此这篇文章就来探究一下适配器模式及其应用场景。

定义

适配器模式,将一个类的接口转换成客户端期望的另一个接口。使得两个没有关联的类能够在适配器的作用下进行合作。

UML类图

适配器模式划分为两种形式:类适配器模式和对象适配器模式。

1、类适配器模式

类适配器模式

由类适配器模式的UML类图,我们可以知道Adaptee是被适配对象,而Target是目标接口,Adapter则是适配器,我们要实现的是让Adaptee具有Target接口,即“转换接口”,客户端能通过Adaptee使用Target功能。在类适配器模式下,这是通过让Adapter继承Adaptee并实现Target接口来实现的(Java不支持多继承,因此只能实现某一接口)。

2、对象适配器模式

对象适配器模式

对象适配器模式的UML类图与类的相似,不同之处在于Adapter与Adaptee的关系不再是继承关系,而是组合关系,Adapter通过持有Adaptee的一个引用并实现Target接口来实现适配器模式。

实现

1、类适配器模式

首先对于一个被适配器,它的代码如下,它有自己特有的方法,但这不是客户端所期望的。

public class Adaptee {

public void specificRequest(){

System.out.println("Adaptee 特有的方法");

}

}

客户端所期望的是Adaptee有另外一个功能,即下面Target接口所提供的方法:

public interface Target {

//客户端所期望的接口方法

void request();

}

也就是说,对于一个具体的Adaptee,我们期望它拥有一个它没有的方法,以达到我们的期望,也即是“接口转换”,下面就是适配器Adapter,它继承自Adaptee,实现了Target接口:

public class Adapter extends Adaptee implements Target {

@Override

public void specificRequest() {

super.specificRequest();

}

@Override

public void request() {

System.out.println("Adaptee 拥有了Target接口的方法,达到了用户的预期");

}

}

2、对象适配器模式

对象适配器模式中,Target接口和Adaptee类与上述代码相同,不同之处在于Adapter不是继承Adaptee,而是用一个成员变量去引用它,代码如下:

public class Adapter implements Target {

private Adaptee mAdaptee;

public Adapter(Adaptee adaptee){

mAdaptee = adaptee;

}

@Override

public void request() {

//接口转换的一系列工作,利用mAdaotee的方法、变量等去实现具体需求

//调用mAdapter.specificRequest()...等

System.out.println("Adaptee 拥有了Target接口的方法,达到了用户的预期");

}

}

举个例子

在日常生活中,与适配器模式有关的最常见的例子就是电压的转换。我们知道,通过电网提供给每个家庭的电压是交流电压220V,但是我们给手机、笔记本电脑充电的时候,并不能直接接在220V交流电上,而是需要通过电源适配器来把交流电转换成直流电,并输出较低的电压来使用。这里的电源适配器其实就是用到了适配器模式,比如苹果手机电源适配器的常用输出是5V/1A,这就是经过转换后的电压,这样才能安全地给用电器充电。下面我们就用代码来模拟这一效果。

(1)先看被适配者adaptee,也即是电网提供的AC 220V:

public class PowerGrid {

/**

* 电网能够直接为我们提供220V AC电压

* @return

*/

public int outPutAC220V(){

return 220;

}

}

(2)下面就是Target接口,也即是客户端所期望电网通过某些转换能够提供的功能:

public interface VoltageConversion {

//客户端期望适配器为我们提供5V和20V的直流电

int outPutDC5V();

int outPutDC20V();

}

(3)接着就是电源适配器了,它实现了Target接口,对外提供了5V和20V的直流电压输出,它内部实现了电网提供的220V交流电的转换:

public class VoltageAdapter implements VoltageConversion {

private PowerGrid mPowerGrid;

public VoltageAdapter(PowerGrid adaptee){

mPowerGrid = adaptee;

}

/**

* 如果有需求,适配器需要输出原来电网能提供的电压

*/

public int outPutAC220V(){

return mPowerGrid.outPutAC220V();

}

@Override

public int outPutDC5V() {

int voltageFromPowerGrid = mPowerGrid.outPutAC220V();

System.out.printf("电源适配器正在工作,将%dV交流电转换成5V直流电...\n",voltageFromPowerGrid);

return 5;

}

@Override

public int outPutDC20V() {

int voltageFromPowerGrid = mPowerGrid.outPutAC220V();

System.out.printf("电源适配器正在工作,将%dV交流电转换成20V直流电...\n",voltageFromPowerGrid);

return 20;

}

}

(4)最后,我们写一个Test测试类,来测试我们的代码:

public class AdapterTest {

public static void main(String args[]){

PowerGrid powerGrid = new PowerGrid();

VoltageAdapter adapter = new VoltageAdapter(powerGrid);

//首先,我们用适配器给苹果手机充电

System.out.println("给苹果手机充电,适配器提供的电压为:" + adapter.outPutDC5V());

//接着,我们用适配器给支持快充的手机充电

System.out.println("给支持QC4.0的手机充电,适配器提供的电压为:" + adapter.outPutDC20V());

}

}

运行结果如下图所示:

运行结果

可以看出,适配器输出了我们想要的5V和20V,它内部对220V交流电压进行电压变换,也即是“接口转换”,把原本不具备的功能兼容到客户所需求的功能上了。

适配器模式和装饰者模式的比较

学习完适配器模式后,读者可能会觉得适配器模式和之前学习过的装饰者模式有很多相似之处,因为它们都持有了一个对象的引用(包装该对象),并且让这个对象做出了这个对象原本没有的行为。那它们之间的区别在哪呢?答案是:适配器模式将一个对象包装起来以改变其接口;而装饰者模式将一个对象包装起来以增加新的行为和责任。

笔者认为,二者的突出的重点不同,适配器模式主要是为了改变接口,也即是被适配对象原本就有一个方法,但不适合客户端使用,为了让客户端可以兼容使用到该方法,就利用了适配器把这个方法进行接口转换,让客户可以使用。那上面的电压转换的例子来说,就是电网本来就提供了一个220V的电压输出,只不过这不符合我们的需求,所以将它转换成5V,即是进行了所谓的接口转换。但装饰者模式,是提供被包装对象所没有的方法,比如装饰者包装一个电网,它除了能提供220V输出之外,还能提供计算电费的功能,即是增加了新的行为和责任。

好了,这篇文章到这里就结束了。本文主要介绍了适配器模式的概念以及实现方法和具体的例子,最后与装饰者模式做了比较,希望各位同学能从中获益。如果可以的话,希望能给我点个赞,谢谢~

java 适配器设计模式_学习、探究Java设计模式——适配器模式相关推荐

  1. java bridge 模式_学习:java设计模式—Bridge模式

    一.引子 下面是吕振宇大牛的一个例子,个人觉得挺好的,有助于理解Bridge模式的设计目的: 设想要绘制一幅图画,蓝天.白云.绿树.小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦.毕竟细细的蜡笔 ...

  2. 适合Java零基础小白学习的Java零基础教程

    很多Java零基础小白,在刚刚快入门的时候玩命的学习,玩命的记住Java原理,天天早上五点起床背Java的一些英文词汇,然后遇见一些未知的困难,让自己打到癫狂状态,逐渐迷失自我放弃Java,为了解决这 ...

  3. java 设计模式_快速上手Java设计模式之简介

    阅读本文约需要5分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分享 ...

  4. 【开源与项目实战:开源实战】77 | 开源实战一(下):通过剖析Java JDK源码学习灵活应用设计模式

    上一节课,我们讲解了工厂模式.建造者模式.装饰器模式.适配器模式在 Java JDK 中的应用,其中,Calendar 类用到了工厂模式和建造者模式,Collections 类用到了装饰器模式.适配器 ...

  5. c++和java哪个难_前端和Java开发哪个难?哪个学习容易一点?

    首先我说一下Java和web两者的区别: Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. ...

  6. java大致了解_学习Java第一天,大致了解

    第一章: java核心 1 了解 java的产生背景 2 了解java的体系结构和组成 3 了解java程序的编写 编译 运行 4 掌握java的 api文档的使用 5 了解 jdk的组成 1. ja ...

  7. java实训西游记人物实现_学习练习 java编写西游记人物类

    package com.hanqi; public class XiYouJiRenWu { double height; String weapon; String name; void prine ...

  8. java程序设计心得_学习Java编程的学习方法总结

    现在越来越多的人学习Java,参加高强度的Java培训,希望毕业后高薪就业,但是学习Java并非是短期内就可以速成的,不可能一口气吃成一个大胖子,4-5个月就能吧全部的技能学完,这需要一个寻寻渐进的过 ...

  9. java培训 三年_一个三年java开发经验的程序员:java学习路线

    做开发的工作已经三年多了,说起来实在是惭愧,自己的知识树还像一棵小草一样,工作中使用到了许多的知识和技术,不过系统性不够.根基不牢.并且不够深入!当然,慢慢的我也更加的清楚,我需要学习一些什么样的知识 ...

  10. 哈尔滨java开发工资_给哈尔滨Java开发初学者的几个学习建议

    对于初学者应该如何学习Java开发技术,纵观中国目前整体行业来说,互联网IT行业成为了拔尖的行业,IT互联网程序开发成了靠自己能力可以多挣一点钱,所以各个行业都在转行,其实互联网不存在饱和,只不过大多 ...

最新文章

  1. MJExtension简介
  2. select子句顺序
  3. mxnet迁移学习 注释版
  4. 通知传值(NSNotificationCenter)
  5. 堆排序(heap_sort)
  6. WAP2.0开发规范及原则
  7. 深度学习快速参考 | iBooker·ApacheCN
  8. javascript中实现动画是settimeout(递归)还是用setinterval好?
  9. ios 通知接收两次_苹果健康体系又进一步,iOS 14.3支持有氧适能通知
  10. 腾讯云数据库TDSQL-学习心得与收获
  11. 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
  12. 通过libxml2的xpath解析xml
  13. JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
  14. python自动化办公---工资说明excel生成word再转换成pdf
  15. (二)C语言开发工具
  16. C#重写和重载的区别分析
  17. 计算机桌面设置定时,电脑桌面定时提醒休息如何设置?
  18. python公众号文章_Python 抓取微信公众号文章
  19. 华硕 ROG STRIX Z690-A GAMING WIFI D4 i7-13700K 黑苹果efi引导文件
  20. SSD1963 LCD驱动 FSMC接口,stm32f207【未完】

热门文章

  1. Office 365 ProPlus用户基本上已经拥有Office 2019
  2. 20210416 东南大学校庆论文格式 笔记
  3. 河北农大计算机专业排名,河北省排名前三高校,河北工业大学位居第一,河北农大无缘前三!...
  4. java实现汉字字典
  5. 亿愿批量验证检测网址链接有效性
  6. 一份很良心的JAVA内功修炼手册No.31
  7. 物联网毕设 51单片机题目项目汇总 - 100例
  8. 低配线比住宅区光分配网(ODN)扩容方案
  9. 易创索讯-百度快照劫持网站是一个致命的伤害。
  10. “人间自有真情在,宜将寸心报春晖”四川翼嘉酒业董事长杨涛 为清华学子送上“爱心大礼”