设配器模式

现实生活中的适配器例子:

  • 泰国插座用的是两孔(欧标),可以买个多功能转换插头(适配器),这样就可以使用了。

基本介绍

  1. 设配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,其别名为包装器
  2. 适配器模式属于结构型模式
  3. 主要分为三类:类适配器模式,对象适配器模式,接口适配器模式

工作原理

  1. 适配器模式:将一个类的接口转换为另一种接口,让原本接口不兼容的类可以兼容
  2. 从用户的角度看不到被适配者,是解耦的
  3. 用户调用适配器转换出来的目标接口方法,适配器再调用被适配者的相关接口方法
  4. 用户收到反馈结果,感觉只是和目标接口交互。

类适配器模式

类适配器模式介绍
Adapter类,通过继承src类,实现dst类接口,完成src->dst的适配
应用实例
以生活充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的目dst(即 目标)是5V直流电

类适配器 的类图

类适配器代码

package com.gduf.adapter.classadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:14* @Version V1.0**/
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {@Overridepublic int output5V() {//获取到220V 的电压int srcV = output220V();int dstV = srcV/44; //转成5Vreturn dstV;}
}
package com.gduf.adapter.classadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:12* @Version V1.0**/
//被适配的类
public class Voltage220V {//输出220v的电压public int output220V(){int src = 220;System.out.println(" 电压="+src+"伏");return src;}
}
package com.gduf.adapter.classadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:15* @Version V1.0**/public class Phone {//充电public void charging(IVoltage5V iVoltage5V){if (iVoltage5V.output5V()==5){System.out.println("电压为5v 可以充电");}else if (iVoltage5V.output5V()>5){System.out.println("电压大于5V,无法充电~");}}
}
package com.gduf.adapter.classadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:13* @Version V1.0**/
//适配接口
public interface IVoltage5V  {public int output5V();
}
package com.gduf.adapter.classadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:17* @Version V1.0**/public class Client {public static void main(String[] args) {System.out.println("-----类适配器模式------");Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}

类适配器的注意事项

  • Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性
  • src类的方法在Adapter中都会暴露出来,也增加了使用的成本
  • 由于其继承 了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了

对象适配器

  1. 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性问题。即:持有src类,实现dst类接口,完成src->dst的适配
  2. 根据 “复合复用原则”,在系统中尽量使用关联关系(聚合)来代替继承关系
  3. 对象适配器模式是适配器模式常用的一种

对象适配器类分析
只需修改适配器即可:如下

public class VoltageAdapter2 implements Voltage5{private Voltage220 voltage220;//持有Voltage220对象 不是继承
}

对象适配器类图

对象适配器模式的注意事项和细节

  • 对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则,使用组合替代继承,所以它解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口
  • 使用成本更低,更灵活

接口适配器模式

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


接口适配器类图

接口适配器代码

package com.gduf.adapter.interfaceadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:48* @Version V1.0**/
public interface Interface4 {public void m1();public void m2();public void m3();public void m4();
}
package com.gduf.adapter.interfaceadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:49* @Version V1.0**/
//在AbsAdapter 我们将Interface4的方法进行默认实现
public abstract class AbsAdapter implements Interface4{//默认实现public void m1(){}public void m2(){}public void m3(){}public void m4(){}}
package com.gduf.adapter.interfaceadapter;/*** @Author 晨边#CB* @Date:created in  2020/3/31 16:50* @Version V1.0**/public class Client {public static void main(String[] args) {AbsAdapter absAdapter = new AbsAdapter() {//我们只需要去覆盖我们 需要使用的接口方法@Overridepublic void m1() {System.out.println("使用了m1的方法");}};absAdapter.m1();}
}

适配器模式在SpringMVC框架中的应用的源码分析

  • SpringMVC中的HandlerAdapter,就使用了适配器模式

  • 使用HandlerAdapter的原因分析:

    • 可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要调用的时候就不得不断是使用if else来进行判断哪一种子类然后执行。那么如果后面要扩展Controller,就得修改原来的代码,这样违背了OCP原则。

说明:

  • springMVC 通过获取对应的Controller源码
  • spring定义了一个适配器接口,使得每一种Controller有一种对应的适配器实现类
  • 适配器代替controller执行相应的方法
  • 扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了

适配器流程

适配器模式的注意事项和细节

  1. 三种命名方式,是根据src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的
  2. 类适配器:以类给到在Adapter里,就是src当做类,继承
  3. 对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有
  4. 接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
  5. Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作
  6. 实际开发中,实现起来不拘泥于讲解三种经典形式

设计模式--设配器模式相关推荐

  1. java设计模式-设配器模式

    1. 适配器模式简介 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用场景: 1.已经存在 ...

  2. 大话设计模式---设配器模式

    1 概述 适配器模式(Adapter):就是把一个类的接口变换成客户端所期待的另一种接口. 适配器模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明 ...

  3. 设计模式:设配器模式

    设配器模式 1.泰国旅游使用插座问题 现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了. 2.适配器模式基本介绍 适配器模式(Adapter ...

  4. 设计模式之设配器模式、外观模式

    设计模式之--设配器模式 适配器模式定义 适配器模式是将一个类的接口转化为另一种期待的接口,适配器让原本接口不兼容的类可以相互合作.适配器模式使用对象组合,以修改的接口包装被适配者,这样做的优点是被适 ...

  5. 设配器模式不止是补救,有时更像是一个创造者

    设配器模式不止是补救,有时更像是一个创造者 适配器模式的官方应用场景是在软件开发后期,应对功能扩展后,新的类结构无法对应之前的接口,从而采用的一种补救措施.然而如果你只记住了这个,你可能会错过一个很重 ...

  6. java设计模式6--适配器模式(Adapter )

    本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...

  7. JAVA设计模式-13-适配器模式

    参考:http://blog.csdn.net/pengjunlee/article/details/52347644 文章中部分经典内容参考以下文章: GoF经典著作< Design Patt ...

  8. 6.Java设计模式之设配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

  9. 设计模式之设配器模式

    适配器模式的作用相当于一种中间件,让俩个对接有冲突的模块很好的捏合在一起从而发挥作用,适配器在其中就是胶水的作用. 看一下代码实例,现在有绿头鸭和火鸡俩种动物,但假如现在你缺少了鸭子对象想用火鸡对象来 ...

最新文章

  1. Paper1:HoPE: Horizontal Plane Extractor for Cluttered
  2. linux I/O--I/O多路复用--详解(四)
  3. go实现命令行的工具cli
  4. 高性能网络编程1----accept建立连接
  5. java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁
  6. 【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API
  7. 查看及修改MYSQL最大连接数
  8. github ssh密钥_如何使用SSH密钥在一台机器上管理多个GitHub帐户
  9. python可变序列_Python3基础(二)—— Python可变序列
  10. web架构设计经验分享(转)
  11. 一个类可以实现多个接口吗_java中接口的概念
  12. pandas添加、修改dataframe中index的列名
  13. vs2010新功能(转)
  14. [转]JavaScript继承详解
  15. SQL Server where和having区别
  16. “那个人样子好怪。”“我也看到了,他好像一条狗。”
  17. Linux - history命令详解
  18. numpy中的revel和flatten
  19. tplink 2.4g弱信号剔除_路由器信号分为2.4G和5G,这两种信号有什么区别
  20. InTra【异常检测:Reconstruction_based】

热门文章

  1. php降序怎写,PHP数组如何按键名实现降序排列
  2. 系统上线后如何确保原始数据的准确性?
  3. Termux基础教程(无编程基础动图展示版)
  4. cad多段线画圆弧方向_(cad多段线画圆弧方向)在cad中如何使用excel画样条曲线
  5. 什么是项目风险?如何做好项目风险管理
  6. 福特汉姆大学计算机科学专业,Fordham的Computer and Information Science「福特汉姆大学计算机与信息科学系」...
  7. VPP协议栈学习一:snd_wnd
  8. java zero fill_一次JavaAssist引发的生产环境CPU报警的问题
  9. java sencha_sencha编译出错
  10. RTKLIB专题学习(七)---精密单点定位实现初识(三)