Java程序设计模式系列之适配器模式
理解适配器设计模式需要从生活中的场景进行联系,在生活当中有那些东西能够称为适配器呢?从字面上理解,“适配”的意思就是让一个东西和另一个东西配对,能够让他们一起工作,比如大家用的笔记本电脑就需要用到电源适配器,转换插口和电流到笔记本上给笔记本电脑进行供电。再比如在国内所有的电器插座都是两口或三口的国内标准插座,但如果到中国大陆以外的地区旅行,想要使用电源给电子产品供电,就需要转换插口了。比如王老师到了香港,看到的电源插座是这样的:
很明显,从国内带去的手机就无法充电了。
那么这个问题怎么解决呢?
经过查找资料,王老师找到了一种产品,它就是长成这个样子的东东,叫“电源适器”。
用法相信大家一看就清楚了。
有个它,妈妈再也不用担心我担心我没有电了。
“哦!我知道了,这不是个转换口吗?”是的,其实跟读卡器的概念是一样的,就是将原本不能用的接口经过适配器转换成能用的接口。
概念:
适配器模式(Adapter):将一个类的接口,转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
“还是没读懂!”不要紧,下面简单易懂的案例+代码,让你明白什么是适配器模式。
接下来我们就以电源这个案例来介绍适配器模式:
这里有两个不兼容的接口,电源A接口和电源B接口,并且有各自相应的实现方法。代码如下:
那么两个接口应该有各自的实现类,代码如下:
接下来就应该是客户端来调用了,先定义电源A开始工作方法:
那么想要调用start方法就需要传入PowerA的实现类对象了。
所以这里我们创建一个PowerAImpl对象,并且调用start方法。
编译后运行的结果是这样滴:
我们这里已经写好了,如果这时我们想传PowerB接口到start方法可以吗?怎么办呢?
那么此时我们有两种办法来实现,第一种:
再添加一个startB方法,但这不是一个好的解决方案,因为在startA中调用insert方法的前后我们可能存在一些逻辑以及业务,同样的在startB中调用connect方法的前后可能存在这些相同的逻辑及业务,就只有connect方法调用这一句不同,那么重写一份就是多余的了,代码重复了。不太符合我们面向对象的编程思想,怎么办呢?往下看。
接下来看第二种解决方案:我们还是想用一个start方法解决这个问题,到这里会有人想到直接把start方法改成适应两个接口的,王老师在此处需要先给大家说明一个问题了,面向对象的编程原则中有一点非常重要的是“对修改关闭,对扩展开放”,如果我们的程序已经上线运行,当时并没有考虑要传PowerB接口进来,只传PowerA接口就好了,但现在业务修改要求也可以传PowerB接口,那么修改方法将对其他已写好的程序造成怎样的影响也是未知的,可能其他小伙伴调用了你的start方法就会出问题了,也就是说调用了你的start方法的代码都会有连锁反应了。OK!看下面!
我们需要实现这样的东东
很显然这样的代码编译是不会通过的,因为目前PowerA和PowerB本来就是两个不同的接口,相当于一个三口的插座和一个两口的根本插不进入是一样的。
要想实现转换,现在需要适配器啦!我们需要把PowerB转换成PowerA传进来,那么我们就给PowerA做一个适配器。
1、首先要适配的是PowerA,所以实现PowerA接口,那么PowerAAdapter就可以作为PowerA的实现类传进start方法了。
2、我们是要用这个适配器将PowerB转成PowerA,那么就需要和PowerB取得联系,所以定义一个PowerB作为属性,并通过构造方法进行初始化操作。
3、实现了PowerA接口需要重写其方法,那么在重写的insert方法中调用PowerB的connect方法,适配器就写好了。
现在来测试一下:
编译之后运行结果是这样滴:
结果说明PowerB接口的实现类开始工作了,但传参数的时候是通过PowerA接口的形式传进来进行工作的。这就是神奇的适配器模式啦!
按照步骤敲一敲代码!更有助于理解!
Java程序设计模式系列之适配器模式的更多相关文章
- 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调
模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...
- java常用设计模式六:适配器模式
一.定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.比如以下的场景: 用手机充电为例,有一个手机的插孔是TypeC口,现在只 ...
- Java设计模式系列之适配器模式
适配器模式的定义 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.(就类似于我们充电器的转接头将220V的电压转换成我们的手机端 ...
- Java多线程设计模式系列
通过几天的认真阅读,发现这是一本难得一见的好书,为了加深巩固学习成功,我打算将书中的例子全部自己实现一遍,特此记录下来也方便其他朋友学习. 第一章,java语言的线程 单线程程序:打印10000次go ...
- C#设计模式系列:适配器模式(Adapter)
在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作 ...
- C#设计模式系列:适配器模式(Adapter Pattern)
一.引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用.但是新环境要求的接口是这些现存对象所不满足的.如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...
- Java描述设计模式(07):适配器模式
本文源码:GitHub·点这里 || GitEE·点这里 一.适配器模式简介 1.基础概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在 ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- Java 设计模式系列(六)适配器模式
Java 设计模式系列(六)适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的结构: 类的适配器模式 对象 ...
随机推荐
- Document 对象
document.body //返回文档的body元素 document.cookies //返回当前文档有关的所有cookie document.createElement() //创建元素节点 d ...
- 来自一位工作一年多的猿的分享 ------- ioc
这是我第一次写东西记录吧:还记得小学老师教的写文章要有"开篇 起伏 高潮...高潮 结束",反正我不会用上: 最近在研究IOC这玩意:百度了很多关于这方面的帖子:关于IOC和DI的 ...
- javaWeb学习总结(4)- HTML 关于head中的<meta>标签
关于<meta> 标签 <meta>标签出现在网页的标题部分,这些信息并不会出现在浏览器页面的显示之中,只会显示在源代码中.也就是在...当中. 主要用途是设置网页语言的编码方 ...
- python socket+tcp三次握手四次撒手学习+wireshark抓包
Python代码: server: #!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名:server.py import socket # 导入 socke ...
- SharePoint 无法删除搜索服务应用程序
在SharePoint的使用中,经常会遇到某些服务创建失败,某些服务删除不成功的情况.这里,我们就遇到了搜索服务创建失败,然后删除也不成功,使用管理中心的UI无法删除,PowerShell命令也无法删 ...
- springboot redis 缓存对象
只要加入spring-boot-starter-data-redis , springboot 会自动识别并使用redis作为缓存容器,使用方式如下 gradle加入依赖 compile(" ...
- 解决shiro和quartz2 版本冲突问题
修改build.gradle compile ("org.quartz-scheduler:quartz:2.2.3") compile ("org.apache.s ...
- 如何有效的跟踪线上 MySQL 实例表和权限的变更
介绍 从系统管理员或 DBA 的角度来讲, 总期望将线上的各种变更限制在一个可控的范围内, 减少一些不确定的因素. 这样做有几点好处: . 记录线上的库表变更; . 对线上的库表变更有全局的了解; . ...
- VR问题无关方向,VR全景为您领航,全景智慧城市已势不可当
2016年,VR绝对是互联网科技圈的一个高频词. 在这一年里,Magic Leap获得阿里领投的近8亿美元的融资,VR公司的商业价值得到认可.Oculus Rift和HTC Vive的VR产品正式发货 ...
- 如何通过JS实现简单抖动效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...