一、模式说明

  在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有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模式)的更多相关文章

  1. [C# 设计模式] Adapter - 适配器模式(两种)

    Adapter - 适配器模式 序 现实生活中,我们常用到适配器. 你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗? 你平时想将三口插座插进二口插座里面,不也需要一个适配器吗? 整 ...

  2. C++设计模式-Adapter适配器模式

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  3. C++设计模式-Adapter适配器模式(转)

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  4. Head First 设计模式 --7 适配器模式 外观模式

    适配器模式:将一个类东街口转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 适配器模式有两种,对象适配器和类的适配器.先看一下对象适配器. 还是看最开始鸭子的例子,如果此时鸭子不够 ...

  5. 一天一个设计模式——模板方法(Template Method)模式

    一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...

  6. 一天一个设计模式——工厂方法(FactoryMethod)模式

    一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...

  7. 设计模式06: Adapter 适配器模式(结构型模式)

    Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ...

  8. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  9. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

随机推荐

  1. 数据结构 c++ 广义表

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  2. DB2常用sql语句

    转 DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操 ...

  3. Java笔记--网络编程

    1.IP地址:InetAddress类 --唯一的标识Internet上的计算机 --本地回环地址(hostAddress)127.0.0.1 主机名(hostName):localhost //根据 ...

  4. vue的MVVM

    Vue的相关知识有 字符串模板 MVVM 虚拟dom和domdiff,查看下一篇笔记 字符串模板 function render(template, data) { const reg = /\{\{ ...

  5. MongoDB_02简介

    MongoDB简介 MongoDB是一个开源,高性能,无模式的文档型数据库. 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以他既可以存储比较复杂的数据类型,又相当的灵活. Mon ...

  6. POJ 2752:Seek the Name, Seek the Fame

    Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13619 Accept ...

  7. ffmpeg 多路实时问题之解决思路

     记得前面有人提出多路视频不实时问题,这个首先需要从网络带宽上查看是否视频帧全实时的到达,还有一个问题就是,即使视频帧全部到达,看起CPU也是足够的,但是却表现为慢镜头这种样子,那么很可能是解码显示的 ...

  8. 第九届蓝桥杯省赛c/c++真题明码题解答案,另类excel解法思路

    直到快比赛才重视起之前学校给报了蓝桥杯,且这段时间一直在做Python,所以没做什么准备. 赛场上做这道题时连反码补码的知识点都记混,所以直接用了excel做这道题目,分享下做题思路.及题解. 标题: ...

  9. PHP开发-模板的使用

    通过今天晚上半个多小时的赵老师对模板的介绍,大致对模板的使用.结构以及开发模板的思想有了个大致的了解. 为什么要开发模板:模板就是将PHP发过过程中使用到.需要操作的事物封装成对象.以便在使用到的时候 ...

  10. 二十三、SAP中内表的修改

    一.通过MODIFY关键字来修改内表的内容,it相当于全部内容,wa相当于一条内容 二.效果如下