什么是适配器模式

顾名思义,适配器模式(Adapter Pattern)当然是用来适配的啦。当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了。

这就好像你兴冲冲地跑去香港,买了个港版的 iPhone6,充电器插头拿回家一看,不能用啊。这时候你多么需要买一个转接头适配器...

你去香港旅游,买的 iPhone6 的充电器插头是英标的,它是那种三脚是方形的插头。

而咱们国标的插头是两只脚,即使是三只脚的插头也和英标不一样。

为了方便,这里我们就假设国标插头就只是两只脚的插头吧。(其实我是懒。。)

好的,目标明确,英标三只脚插头充电,国标两只脚插头充电。你家很富,有很多插座可以充电。

适配器模式示例代码

在国内的家中只能用国标接口进行充电。


// 国标插头
public interface CnPluginInterface {void chargeWith2Pins();
}// 实现国标插座的充电方法
public class CnPlugin implements CnPluginInterface {public void chargeWith2Pins() {System.out.println("charge with CnPlugin");}
}// 在国内家中充电
public class Home {private CnPluginInterface cnPlugin;public Home() { }public Home(CnPluginInterface cnPlugin) {this.cnPlugin = cnPlugin;}public void setPlugin(CnPluginInterface cnPlugin) {this.cnPlugin = cnPlugin;}// 充电public void charge() {// 国标充电cnPlugin.chargeWith2Pins();}
}// 国标测试类
public class CnTest {public static void main(String[] args) {CnPluginInterface cnPlugin = new CnPlugin();Home home = new Home(cnPlugin);// 会输出 “charge with CnPlugin”home.charge();}
}

然而,当把 iPhone6 带回来时,因为与家里的插座不匹配,所以需要一个适配器。这个适配器必须满足以下条件:

  1. 插头必须符合国内标准的接口,否则的话还是没办法插到国内插座中;
  2. 在调用上面实现的国标接口进行充电时,提供一种机制,将这个调用转到对英标接口的调用 。

这就要求:

  1. 适配器必须实现原有的旧的接口
  2. 适配器对象中持有对新接口的引用,当调用旧接口时,将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。
// 英标插头
public interface EnPluginInterface {void chargeWith3Pins();
}// 实现英标插座的充电方法
public class EnPlugin implements EnPluginInterface {public void chargeWith3Pins() {System.out.println("charge with EnPlugin");}
}//适配器
public class PluginAdapter implements CnPluginInterface {private EnPluginInterface enPlugin;public PluginAdapter(EnPluginInterface enPlugin) {this.enPlugin = enPlugin;}// 这是重点,适配器实现了国标的插头,然后重写国标的充电方法,在国标的充电方法中调用英标的充电方法@Override
public void chargeWith2Pins() {enPlugin.chargeWith3Pins();}
}// 适配器测试类
public class AdapterTest {public static void main(String[] args) {EnPluginInterface enPlugin = new EnPlugin();Home home = new Home();PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);home.setPlugin(pluginAdapter);// 会输出 “charge with EnPlugin”home.charge();}
}

这样就实现了对 iphone6 进行充电。

适配器模式的应用

前面已经说了,当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了,其主要作用就是在旧的接口、新的接口之间完成适配。

比如说,做过 Android 的同学肯定写 ListView 的适配器都写吐了吧...

适配器模式的三个特点:

  • 适配器对象实现原有接口
  • 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
  • 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

Java学习笔记之设计模式(4)适配器模式相关推荐

  1. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  2. java学习笔记十三

    11. 凡是继承了FilterOutputStream或FilterInputStream的类都是过滤流,也就是说他们不能直接跟目标(键盘,文件,网络等,节点流可以)数据打交道,只能包装 Intput ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  5. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

  6. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  7. java学习笔记12--异常处理

    java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...

  8. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

  9. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  10. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

最新文章

  1. java final bigd_【BigData】Java基础_常量
  2. oracle rac scan ip 用途 原理
  3. 有关Vector里面元素重复解决办法
  4. java多线程写在哪一层_面试知识点三:Java多线程
  5. 编程大讲坛、坛坛是佳酿--编程大讲坛:Visual Basic核心开发技术从入门到精通...
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (10) - 乱序引擎概述
  7. 运维监控利器Nagios之:Nagios的日常维护和管理
  8. 在VB语言中,DOEVENTS的具体的用法和含义
  9. 全连接神经网络的二分类问题
  10. 债券数据集:绿色债券数据集、历时新发、发行债券、DCM定价估值四大指标数据
  11. 工程项目管理系统-专注项目数字化管理-工程管理
  12. 虚拟机怎么装服务器系统教程视频,云服务器装虚拟机教程视频
  13. 使用PlayCanvas制作一个简单的小游戏(三)
  14. php应用于哪些地方,php的应用范围
  15. 2020,开启我人生的新篇章。
  16. Pr:VR 沉浸式视频
  17. COBIT简介 (一)
  18. Git和SourceTree入门教程
  19. 详解 30 道 Vue 面试题
  20. MATLAB R2016a版——改变Simulink中Scope输出波形的颜色

热门文章

  1. [Everyday Mathematics]20150112
  2. C# 线程同步 信号量 Semaphore
  3. 【Mybatis】mapper文件的解析
  4. 【Spring-AOP】自动代理类AnnotationAwareAspectJAutoProxyCreator
  5. MySQL5.7的下载以及安装
  6. JVM、JRE、JDK、Java SE、Java EE、Java ME
  7. Linux下mysql数据库的自动备份与还原 远程备份和本地备份
  8. 华为不同vlan单臂路由的配置
  9. SQLServer------基本操作
  10. C3P0数据库连接池