一天一个设计模式——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)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...
随机推荐
- python2学习------基础语法5(文件操作)
1.文件内容读取 a.txt teestttttttttttttt teestttttttttttttt teestttttttttttttt teestttttttttttttt teesttttt ...
- QT5安装
Windows+Qt5.3.1+VS2013安装教程 https://blog.csdn.net/two_ye/article/details/96109876 (已成功)windows下,VS201 ...
- iOS 十种线程锁
锁 是什么意思? 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. 这里顺便提一下,上锁 ...
- 小程序导航组件navigator活学活用
小程序开发中必不可少的组件navigator,虽然使用频率非常高,但是却没多少人能灵活运用. 先说navigator组件的用处: 它的主要用处是跳转执行,跳转可分为当前页面内跳转.前往页面外部的跳转. ...
- python 聚类分析 k均值算法
dataSet = [ #数据集 # 1 [0.697, 0.460], # 2 [0.774, 0.376], # 3 [0.634, 0.264], # 4 [0.608, 0.318], # 5 ...
- jenkins#构建并部署springboot的jar包
0. 前提是有一个可以用的没有问题的Jenkins环境,这是基础 1. 安装publish over ssh 插件,(如果网速太慢,请去github 克隆代码,然后自己构建,然后上传安装此插件) 2. ...
- wdcp升级php5.8到php7.1.12后安装swoole
http://pecl.php.net/package/swoole wget http://pecl.php.net/get/swoole-4.0.1.tgztar zxvf swoole-4.0. ...
- Maven的原理和使用
一.Maven能做什么 1.假设我们有10个项目,都需要引入spring core模块,那么需要十份重复的Spring Core.jar和commons-logging.jar 使用Maven:mav ...
- H5页面单点登录跳回首页 http url参数转义
在往首页跳的时候因为是单点登录进来的,url后面会带有参数,然后存入会话,所以我要拿到原本存入会话的参数放入url后面 但是返回的时候页面报错了 http://localhost:18086/h5ap ...
- 07 MySQL常用内置函数
常用函数 1.字符串函数 CONCAT(str1,str2,..,strN) 将str1,str2..strN 拼接成一个字符串,当这里有任何一个为NU ...