概念:

适配器模式将一个类的接口,转换为客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

术语:

  • source:待适配的类/对象/接口
  • Adapter:适配器
  • destination:适配后可用的类/对象/接口

分类:

  • 类适配器模式
    Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配

  • 对象适配器模式
    将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination 类接口,完成source->Destination 的适配

  • 接口适配器模式
    当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求适用于一个接口不想使用其所有的方法的情况

案例:

需求:电源适配的项目,要让手机能够使用220V的交流电;注意,手机只接受5.5V的电压;

适配器模式分类三种体现形式思想都大同小异,这里就只介绍最常用的 对象适配器模式;

使用适配器前:

package com.javaxl.design.adapter.before;/*** @author 借我丹青妙笔** 220V的电压*/
public class Voltage220V {private double voltage;public Voltage220V() {this.voltage = 220;}public double getVoltage() {return voltage;}public void setVoltage(double voltage) {this.voltage = voltage;}
}/**
*手机类
*/
public class Phone {//    充电public void charge(Voltage220V voltage220V){//在这里我们应该传入的是一个充电器,而非220v电压。double voltage = voltage220V.getVoltage() / 40;//这里通过手动除以40虽然可以得到我们需要的5.5v的电压。但这么设计不合理。但不可否认这样能得到我们需要的值。System.out.println("最终手机充电所用电压:" + voltage + "V");}
}public class Client {public static void main(String[] args) {Phone phone = new Phone();
//        已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//        还一种方案:新增5V的一个Voltage5V,Voltage的电压可以被手机使用
//        但是这违背现实生活现象,现实生活中只有220V的电源,其他的电源都是通过适配得来的phone.charge(new Voltage220V());}
}

使用适配器模式后:

package com.javaxl.design.adapter.after;/*** @author 借我丹青妙笔** 220V的电压*/
public class Voltage220V {private double voltage;public Voltage220V() {this.voltage = 220;}public double getVoltage() {return voltage;}public void setVoltage(double voltage) {this.voltage = voltage;}
}/*** 目标接口*/
interface Voltage5V{double getVoltage();
}/*** 适配器:里面封装了source源到destination目标的过程*/
class VoltageAdapter implements  Voltage5V{private Voltage220V voltage220V;public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic double getVoltage() {return voltage220V.getVoltage() / 40;}
}package com.javaxl.design.adapter.after;public class Phone {//    充电public void charge(Voltage5V voltage5V){double voltage = voltage5V.getVoltage();System.out.println("最终手机充电所用电压:" + voltage + "V");}
}public class Client {public static void main(String[] args) {Phone phone = new Phone();
//        已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//        VoltageAdapter适配器对Voltage220V这个不能直接使用的电源适配后就可以使用了phone.charge(new VoltageAdapter(new Voltage220V()));}
}

两张图让你了解适配器起到的作用:


注意事项和细节:
Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作

应用:

SpringMvc框架中HandlerAdapter类、
安卓中监听适配器类中就使用了接口适配器(上拉、下拉…)

学习记录,若有错误,欢迎指正。
作者:借我丹青妙笔

Java23种设计模式之适配器模式(Adapter)相关推荐

  1. 二十三种设计模式[6] - 适配器模式(Adapter Pattern)

    前言 适配器,属于类结构型模式.<设计模式 - 可复用的面向对象软件>一书中将之描述为" 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可 ...

  2. JAVA23种设计模式学习,源码+案例分析+类图讲解

    本文对JAVA中23种设计模式进行了简单的讲解,幷加以实际案例进行辅助理解,每种模式都会举例说明,幷将源码开源至gitee和githbu上.JAVA目录下为源码,resources目录下的UML文件夹 ...

  3. JAVA23种设计模式(2)-结构型模式7种

    JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...

  4. 【设计模式】—— 适配器模式Adapter

    模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...

  5. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  6. Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

    源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...

  7. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  8. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  9. 设计模式之适配器模式(Adapter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. java-运算符以及简单运用
  2. SaaS平台只是传统管理软件的试衣间
  3. WPF 资源字典【转】
  4. dos命令行设置网络优先级_计算机网络故障及其维修方法
  5. 对flex-grow和flex-shrink的深入理解
  6. 一文读懂Java泛型中的通配符 ?
  7. 【UVA10562】Undraw the Trees(括号表示法输出树+fegts读取)
  8. 离散数学左孝凌版答案
  9. 如何在Linux中考硬盘数据,Linux硬盘文件数据粉碎
  10. Spring Cloud Eureka 全解 (5) - 自我保护机制
  11. el-upload+额外的参数 , element上传功能组件及其参数的详解
  12. 用PS怎样把一个字体居中整个图片
  13. Win10(家庭版)虚拟机安装
  14. 基于SSM框架的音乐网站系统设计与实现
  15. Leetcode 874. Walking Robot Simulation
  16. 08 Git中本地工作与远程仓库的同步
  17. AtCoder ABC161 E - Yutori
  18. 小暑将至,一起来看看品牌小暑海报吧
  19. 安装ZoneAlarm提示无法找到zpeng24.dll解决方法
  20. 线性系统与非线性系统的稳定性

热门文章

  1. jquery-confirm使用方法
  2. ajax上传文件之ajaxfileupload使用详解
  3. Java:使用Robot类模拟键盘, 以Alt码方式输出汉字
  4. 多米诺骨牌效应(转载)
  5. asp.net mvc 实现自定义AuthorizeAttribute(权限验证)标签 无效的一种原因
  6. java xfire指定参数名_xfire中自定义参数名
  7. 实现不同网段valn互访
  8. 「镁客·请讲」险境求生,《风暴Storm》用写剧本的方式打造全新VR游戏体验
  9. Java nio 异常_java.nio.BufferOverflowException 异常问题
  10. 枪神6plus硬件性能评测