一天一个设计模式——Adapter适配器模式(Wrapper模式)
一、模式说明
在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连接屏幕。有了这个适配器,我们不需要重新买HDMI接口电脑的电脑,就可以达到我们连接外置显示器的目的。
在程序设计领域,很多时候我们的工作是在现有类的基础上继续开发的,如果这个类已经实现了我们要的功能且该类经过充分测试(修改它可能会引入bug),但是接口不符合当前程序环境规范,需要适当转换,这时就用到了Adapter模式的设计思想,创建一个Adapter适配器(Wrapper包装器),使原有的类能适应新的程序环境。
二、模式分类
Adapter模式有以下两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
三、适配器模式中的角色
- Target对象:负责定义所需要的方法,具体的业务需求(如上面例子中的HDMI视频接口);
- Client请求者:负责使用Target角色定义的方法做具体处理(如上面例子中的显示器,使用Target提供的HDMI接口来显示图像);
- Adaptee被适配:一个持有既定方法的角色(如面例子中的笔记本电脑,持有Type-C接口输出);
- Adapter适配器:Adapter模式的主人公,使用Adaptee的方法来满足Target的需求;
四、代码示例
使用继承的类适配器:
TypeCVideo类(Adaptee):
package com.designpattern.cn.adapterpattern; public class TypeCVideo {
private String videoContent; public TypeCVideo(String videoContent){
this.videoContent = videoContent;
} public void typecOut(){
System.out.println(videoContent);
}
}
ShowHdmiVideo类(Target对象):
package com.designpattern.cn.adapterpattern; public interface ShowHdmiVideo {
public abstract void HdmiOut();
}
TypeCToHdmiCable类(Adapter类):
package com.designpattern.cn.adapterpattern; /**
* <p>TypeCToHdmiCable TypeC转HDMI线 适配器类</p>
*/
public class TypeCToHdmiCable extends TypeCVideo implements ShowHdmiVideo { //TypeC转HDMI线 TypeCToHdmiCable类继承了TypeCVideo类
public TypeCToHdmiCable(String videoContent){
super(videoContent);//设置父类的视频内容videoContent字段
}
@Override
public void HdmiOut() {
typecOut();
}
}
测试运行结果:
上面的例子,通过继承TypeCVideo的方式创建新的类,并实现新业务需要的HDMI接口,从而将TypeC中视频流(Video Streaming字符串)从HDMI接口输出处来。
使用委托的对象适配器模式:
【委托:委托的意思就是交给他人,自己因为某些原因做不了的事情,将事情吩咐给别人做,在JAVA中,委托就是将某个方法中的实际处理交给其他实例的方法】
将上述ShowHdmiVideo接口改为ShowHdmiVideo类:
package com.designpattern.cn.adapterpattern; public abstract class ShowHdmiVideo{
public abstract void HdmiOut();
}
TypeCToHdmi适配器类修改如下:
package com.designpattern.cn.adapterpattern; /**
* <p>TypeCToHdmiCable TypeC转HDMI线 适配器类</p>
*/
public class TypeCToHdmiCable extends ShowHdmiVideo {
private TypeCVideo typeCVideo; public TypeCToHdmiCable(String videoContent){
this.typeCVideo = new TypeCVideo(videoContent);
} //当适配器HDMI视频输出方法被调用的时候,并不是TypeCToHdmiCable这个适配器类自己进行处理,而是交给了TypeCVideo类实例的typec输出
public void HdmiOut() {
typeCVideo.typecOut();
}
}
其他定义保持不变,再次运行程序,结果相同:
五、相关的设计模式:
- Bridge桥接模式:Adapter模式用于连接两个接口不同的类;而Bridge模式用于连接类的功能层次结构与实现层次结构。
- Decorator装饰器模式:Adapter模式用于填补不同接口之间的缝隙(接口不兼容),而Decorator装饰器模式用于在不改变API接口的前提下,增强功能(Spring中的IO流,数据源,都使用了Decorator模式包装)。
一天一个设计模式——Adapter适配器模式(Wrapper模式)的更多相关文章
- [C# 设计模式] Adapter - 适配器模式(两种)
Adapter - 适配器模式 序 现实生活中,我们常用到适配器. 你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗? 你平时想将三口插座插进二口插座里面,不也需要一个适配器吗? 整 ...
- C++设计模式-Adapter适配器模式
Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...
- C++设计模式-Adapter适配器模式(转)
Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...
- Head First 设计模式 --7 适配器模式 外观模式
适配器模式:将一个类东街口转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 适配器模式有两种,对象适配器和类的适配器.先看一下对象适配器. 还是看最开始鸭子的例子,如果此时鸭子不够 ...
- 一天一个设计模式——模板方法(Template Method)模式
一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- 设计模式06: Adapter 适配器模式(结构型模式)
Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ...
- C#设计模式(7)——适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- C#设计模式之七适配器模式(Adapter)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...
随机推荐
- 今日份学习: Spring中使用AOP并实现redis缓存?
笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...
- vue 线上,本地,不同变量配置
线上的接口和本地的接口不一样,每次打包的时候要手动更改很麻烦.自动让他配置 1.修改package.json --mode line 传参数line给配置项,编译buildline的时候,就能把li ...
- PAT (Advanced Level) 1128~1131:1128N皇后 1129 模拟推荐系统(set<Node>优化) 1130 中缀表达式
1128 N Queens Puzzle(20 分) 题意:N皇后问题.按列依次给定N个皇后的行号,问N个皇后是否能同时不存在行冲突.列冲突和主副对角线冲突. 分析: 1.根据题意一定不存在列冲突,所 ...
- Codestorm:Game with a Boomerang
题目连接:https://www.hackerrank.com/contests/codestorm/challenges/game-with-a-boomerang 上一篇博客不知怎么复制过来题目, ...
- HihoCoder第四周:Trie图
第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...
- STM32+Nokia5110LCD
Nokia5110LCD(84*48) lcd.h #ifndef _LCD_H#define _LCD_H #include "sys.h" #include "std ...
- (一)微信小程序环境搭建
1 注册 首先 打开(https://mp.weixin.qq.com/)微信公众平台官网 选着 小程序 之后 在新的页面选择 选着前往注册 按照提示注册 注意:个人版和企业版有一定的区别 2 开发者 ...
- Docker Yearning + Inception SQL审核平台搭建
[一]安装[1.1]系统环境系统环境:CentOS Linux release 7.6.1708 (Core)系统内存:4G系统内核:1Python:3.6.4关闭iptables and selin ...
- springboot#filter
_ Filter不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链.完 ...
- JavaScript 对象所有API解析【2020版】
JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...