Java十分钟精通进阶适配器模式


Posted in Java/Android onApril 06, 2022

1、什么是适配器模式?

其实适配器这三个字大家应该很熟悉,我们知道苹果公司的手机iPhone已经不提供充电插头了,包装盒内只有一根数据线,那么我们无法单独使用这根数据线进行在220V的插板上充电,因此我们需要重新购买一个适配器来把插板和手机连接起来,这就是适配器。

其实在软件设计中也可能出现,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。

2、适配器模式的定义

适配器模式: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

3、适配器模式的优缺点

优点:

  • 客户端通过适配器可以透明地调用目标接口
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
  • 在很多业务场景中符合开闭原则

缺点:

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱

4、适配器模式的结构与实现

(以下结构参考自互联网)

模式的结构:

  • 目标(Target)接口: 当前系统业务所期待的接口,它可以是抽象类或接口
  • 适配者(Adaptee)类: 它是被访问和适配的现存组件库中的组件接口
  • 适配器(Adapter)类: 它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者

类适配器模式的结构:

Java十分钟精通进阶适配器模式

对象适配器模式的结构:

Java十分钟精通进阶适配器模式

5、适配器模式的代码实现

A、使用组合的方式实现适配器:

我们现在有一台笔记本电脑的插头的三相的,但是我们现在需要使用二相的插头进行充电,所以我们需要给这个插头装上一个二相的适配器:

Java十分钟精通进阶适配器模式

三相插座接口:

/**
 * 三相插座接口
 */
public interface ThreePlugIf {

    //使用三相电流供电
    public void powerWithThree();

}

国标的二相插座:

/**
 * 国标的二相插座
 */
public class GBTowPlug {
    public void powerWithTwo(){
        System.out.println("使用二相电流供电");
    }
}

笔记本:

/**
 * 笔记本
 */
public class NoteBook {

    private ThreePlugIf plug;

    public NoteBook(ThreePlugIf plug){
        this.plug = plug;
    }

    //使用插座充电
    public void charge(){
        plug.powerWithThree();
    }
}

三相转二相的插座适配器:

/**
 * 三相转二相的插座适配器
 */

public class TwoPlugAdapter implements ThreePlugIf {


    private GBTowPlug plug;

    public TwoPlugAdapter(GBTowPlug plug) {
        this.plug = plug;
    }

    @Override
    public void powerWithThree() {
        System.out.println("通过转换");
        plug.powerWithTwo();
    }
}

测试类:

public class Test {

    public static void main(String[] args) {

    GBTowPlug two = new GBTowPlug();
    ThreePlugIf three = new TwoPlugAdapter(two);
    NoteBook nb = new NoteBook(three);
    nb.charge();
	}
}

输出结果:

通过转换
使用二相电流供电

采用组合方式的适配器称为对象适配器

特点:

把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装给适配者

B、使用继承的方式实现适配器:

Java十分钟精通进阶适配器模式

继承适配器:

/**
 * 采用继承方式的插座适配器
 */
public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{
    @Override
    public void powerWithThree() {
        System.out.println("借助继承适配器");
        this.powerWithTwo();
    }
}

测试类:

public class Test {

    public static void main(String[] args) {

    GBTowPlug two = new GBTowPlug();
    ThreePlugIf three = new TwoPlugAdapter(two);
    NoteBook nb = new NoteBook(three);
    nb.charge();

    //使用继承方法
    three = new TwoPlugAdapterExtends();
    nb = new NoteBook(three);
    nb.charge();
}
}

输出:

通过转换
使用二相电流供电

借助继承适配器
使用二相电流供电

采用继承方式的称为类适配器

特点:

通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配

6、适配器模式的应用场景

  • 之前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同

最后,祝大家假期愉快~~~~

到此这篇关于Java十分钟精通进阶适配器模式的文章就介绍到这了,更多相关Java 适配器模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
详解Java实现数据结构之并查集
Jun 23 Java/Android
SpringBoot实现异步事件驱动的方法
Jun 28 Java/Android
Maven学习----Maven安装与环境变量配置教程
Jun 29 Java/Android
每日六道java新手入门面试题,通往自由的道路
Jun 30 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
Java获取e.printStackTrace()打印的信息方式
Aug 07 Java/Android
OpenCV实现反阈值二值化
Nov 17 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Java实现经典游戏泡泡堂的示例代码
Apr 04 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
springcloud整合seata
May 20 Java/Android
Android RecyclerView实现九宫格效果
Jun 28 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 #Java/Android
Spring Boot项目传参校验的最佳实践指南
springboot入门 之profile设置方式
Apr 04 #Java/Android
Java实现经典游戏泡泡堂的示例代码
Dubbo+zookeeper搭配分布式服务的过程详解
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 #Java/Android
SpringBoot整合Minio文件存储
Apr 03 #Java/Android
You might like
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
php封装的page分页类完整实例
2016/10/18 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
车辆维修工自我评价怎么写
2013/09/20 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
岗位工作说明书
2014/07/29 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书