设计模式:适配器模式
适配器模式(Adapter Pattern)的官方解释:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而
使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
很难理解官方这种说给懂的人听的解释,一般在学习设计模式时,首先疑问最大的就是,什么时候该用到这种设计模式是最合理的呢,我觉得比较直观得还是找出某项目中使用该设计模式,和不使用该设计模式的直接对比,这样理解起来就有一种茅塞顿开的感觉。
客观的解释,适配器模式,就是解决旧的接口和新的接口不兼容的问题,网上看到了一个很好的例子:
一个德国旅馆(Hotel),房间的插座都是两个孔的,一直以来都住的是德国人,德国人的手机充电器都是两个孔的,这样给手机充电就不会发生任何冲突和问题。突然有一天,酒店来了个中国人,中国人的手机充电器却是三个孔的。如果没有适配器,那酒店就得装一个三孔插座,这样就得重新装修,而且每个房间都得装,工作量巨大。于是酒店就想了一个不改变酒店的前提下(开闭原则),解决这个问题的办法:适配器模式。给每个房间装一个适配器,适配器接通两孔插座,适配器本身具有两孔和三孔的功能,就解决了此问题。
之前解释过了,适配器模式是皆苦额新旧不兼容的问题。这里的旧,指的就是德国旅店里的两孔插座,新指的是中国人需要用到的三孔插座。
组装适配器的角色:
对象适配器:
目标接口(或者抽象类)Target: 客户所期待的接口,可以是一个抽象类或接口,也可以是具体类。这里指的是德国插座,这一点解释一下,比较抽象。客户所期待的另一种接口,期待的就是德国插座能够让中国充电器冲上电的接口,但是德国插座是无法给中国充电器使用的,这里旧构成了开头所说的接口不匹配的问题。
需要适配的类(适配者)Adaptee: 需要适配的类,也就是中国插座。
适配器 Adapter:不说也懂吧,通过包装一个适配者,把原接口转换成目标接口。就是把德国插座转为中国插座。
下面用代码来说明一切:
在不使用适配器的情况下:
创建德国旅馆前一定得有德国插座:
public class DGSocket {public void insertSocket(){System.out.println("插入德国插座");}
}
接着创建旅馆:
public class Hotel {public void startCharge(DGSocket dgSocket){dgSocket.insertSocket();System.out.println("开始充电");}
}
运行:
public class Test {public static void main(String[] args) {DGSocket dgSocket = new DGSocket();Hotel hotel = new Hotel();hotel.startCharge(dgSocket);}
}
结果:
过了几年,来了个中国人,因此现在需要中国插座:
public class ZGSocket {public void insertSocket(){System.out.println("插入中国插座");}
}
这下适配器就登场了:
public class SocketAdapter extends DGSocket{private ZGSocket zgSocket;public SocketAdapter(ZGSocket zgSocket) {this.zgSocket = zgSocket;}@Overridepublic void insertSocket(){zgSocket.insertSocket();}
}
这里注意一下,不管是对象适配器还是类适配器,都需要对旧接口做继承或者实现(若就接口是一个类,像上述那样,则无法实现类适配器,应为无法在继承或者实现了,任何对象只有一个父类)。
对象适配器和类适配器的唯一区别:对象适配器是在适配器中增加一个适配者的属性,应为属性可以定义多个,所有可以适配多个适配者。但是继承只能继承一个(继承适配者类),所以类适配器无法适配多个适配者。若是类适配器,旧接口必须为接口,不然无法实现类适配器。
Test类运行:
public class Test {public static void main(String[] args) {ZGSocket zgSocket = new ZGSocket();// 这一步是关键,DGSocket dgSocket = new SocketAdapter(zgSocket);Hotel hotel = new Hotel();hotel.startCharge(dgSocket);}
}
运行结果:
这就是官方所说的:从而
使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
类适配器:
若是类适配器,DGSocket 就必须为接口了:
public interface DGSocket {// 为了区分和ZG的方法重载的问题,改了下名称public void insertDGSocket();
}
适配器:
public class SocketAdapter extends ZGSocket implements DGSocket {@Overridepublic void insertDGSocket() {super.insertSocket();}
}
和对象适配器类型显而易见。
Test运行:
public class Test {public static void main(String[] args) {SocketAdapter adapter = new SocketAdapter();Hotel hotel = new Hotel();hotel.startCharge(adapter);}
}
结果:
总接:
下班了,以后在总结
设计模式:适配器模式相关推荐
- Python设计模式-适配器模式
Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...
- Java | 设计模式-适配器模式
继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...
- java设计模式适配器模式_Java中的适配器设计模式
java设计模式适配器模式 适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码. 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比. 在设计一 ...
- 设计模式适配器模式_适配器设计模式示例
设计模式适配器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要 ...
- 设计模式适配器模式_21世纪的设计模式:适配器模式
设计模式适配器模式 这是我的演讲的第三部分," 21世纪的设计模式" . 适配器模式桥接世界. 在一个世界中,我们有一个概念的界面. 在另一个世界,我们有不同的界面. 这两个接口有 ...
- java设计模式适配器模式_Java解释器设计模式
java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...
- Java代码审计-设计模式-适配器模式
Java设计模式-适配器模式(Adapter Pattern) 目录 什么是适配器模式 适配器模式的3种类型 JavaSE适配器模式的应用 Struts2适配器模式的应用 适配器模式是一种" ...
- 【设计模式】Java设计模式 - 适配器模式
[设计模式]Java设计模式 - 适配器模式
- C++设计模式——适配器模式(adapter pattern)
一.原理讲解 适配器模式别名为包装器(wrapper),分为类适配器(通过多继承实现).对象适配器(组合方式实现),由于类适配器比较少用,本文主要讲解用的比较多的对象适配器. 1.1意图 将一个类的接 ...
- [Head First设计模式]身边的设计模式——适配器模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
最新文章
- 深入理解vue中的slot与slot-scope
- android 回退函数,详解React Native监听Android回退按键与程序化退出应用
- Mac openCV环境搭建
- 解决 RaspberryPi 树莓派 NTP服务异常 无法自动同步时间
- 据说集齐这些特点的智能硬件百分百“作死”
- DeepLab图像分割
- 基于大数据挖掘----浅谈大数据与大数据挖掘
- 软件需求说明书 (1)
- 软件工程项目学生管理系统
- 机电一体化柔性生产线加工系统
- java 运行器_[原创]我也来做一个最简单的Java2EXE的运行器
- SaaSBase:免费的思维导图软件:2022年9种最好的工具
- 干得好也要说得好| 这样向领导汇报,让你在职场上如鱼得水
- Canal Admin Web-UI 学习
- 程序员武器之键盘,适用于其他文字录入者
- find the longest of the shortest HDU - 1595
- 基音周期 检测 matlab,语音信号基音周期检测的matlab程序
- Vue上传文件 iview Upload UI 组件上传组件
- TeamTalk安装部署手册
- DSO Framer 使用介绍(ZZ)转
热门文章
- python meta_Python中的metaclass
- jsplumb php,简书 jsPlumb使用
- Oracle数仓中判断时间连续性的几种SQL写法
- 动手学深度学习v2 p1引言 监督学习与无监督学习
- python同步和异步的区别_Python语言---同步和异步
- 【无标题】XVFI: eXtreme Video Frame Interpolation (ICCV oral)
- GPU显卡,显存位宽
- Chapter 5 Blood Type——19
- 构建我国高等教育专业认证制度的建议
- 网络安全中护网是什么意思?有CISP和NISP证书可以参加吗?