一天一个设计模式——Adapter适配器模式(Wrapper模式)

摘要:
在程序设计领域,我们的大部分工作是在现有类的基础上继续开发。如果这个类已经实现了我们想要的功能,并且该类已经过充分的测试,但是该接口不符合当前的程序环境规范,需要进行适当的转换,那么我们使用适配器模式的设计思想来创建适配器适配器,以便原始类能够适应新的程序环境。装饰器模式:适配器模式用于填补不同接口之间的空白,而装饰器模式用于在不改变API接口的情况下增强功能。

一、模式说明

  在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连接屏幕。有了这个适配器,我们不需要重新买HDMI接口电脑的电脑,就可以达到我们连接外置显示器的目的。

  在程序设计领域,很多时候我们的工作是在现有类的基础上继续开发的,如果这个类已经实现了我们要的功能且该类经过充分测试(修改它可能会引入bug),但是接口不符合当前程序环境规范,需要适当转换,这时就用到了Adapter模式的设计思想,创建一个Adapter适配器(Wrapper包装器),使原有的类能适应新的程序环境。

二、模式分类

Adapter模式有以下两种:

  • 类适配器模式(使用继承的适配器)

一天一个设计模式——Adapter适配器模式(Wrapper模式)第1张

  • 对象适配器模式(使用委托的适配器)

一天一个设计模式——Adapter适配器模式(Wrapper模式)第2张

三、适配器模式中的角色

  • Target对象:负责定义所需要的方法,具体的业务需求(如上面例子中的HDMI视频接口);
  • Client请求者:负责使用Target角色定义的方法做具体处理(如上面例子中的显示器,使用Target提供的HDMI接口来显示图像);
  • Adaptee被适配:一个持有既定方法的角色(如面例子中的笔记本电脑,持有Type-C接口输出);
  • Adapter适配器:Adapter模式的主人公,使用Adaptee的方法来满足Target的需求;

四、代码示例

使用继承的类适配器:

TypeCVideo类(Adaptee):

一天一个设计模式——Adapter适配器模式(Wrapper模式)第3张一天一个设计模式——Adapter适配器模式(Wrapper模式)第4张
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);
    }
}
View Code

ShowHdmiVideo类(Target对象):

一天一个设计模式——Adapter适配器模式(Wrapper模式)第5张一天一个设计模式——Adapter适配器模式(Wrapper模式)第6张
package com.designpattern.cn.adapterpattern;

public interface ShowHdmiVideo {
    public abstract void HdmiOut();
}
View Code

TypeCToHdmiCable类(Adapter类):

一天一个设计模式——Adapter适配器模式(Wrapper模式)第7张一天一个设计模式——Adapter适配器模式(Wrapper模式)第8张
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();
    }
}
View Code

测试运行结果:

一天一个设计模式——Adapter适配器模式(Wrapper模式)第9张

上面的例子,通过继承TypeCVideo的方式创建新的类,并实现新业务需要的HDMI接口,从而将TypeC中视频流(Video Streaming字符串)从HDMI接口输出处来。

使用委托的对象适配器模式:

【委托:委托的意思就是交给他人,自己因为某些原因做不了的事情,将事情吩咐给别人做,在JAVA中,委托就是将某个方法中的实际处理交给其他实例的方法】

将上述ShowHdmiVideo接口改为ShowHdmiVideo类:

一天一个设计模式——Adapter适配器模式(Wrapper模式)第10张一天一个设计模式——Adapter适配器模式(Wrapper模式)第11张
package com.designpattern.cn.adapterpattern;

public abstract class ShowHdmiVideo{
    public abstract void HdmiOut();
}
View Code

TypeCToHdmi适配器类修改如下:

一天一个设计模式——Adapter适配器模式(Wrapper模式)第12张一天一个设计模式——Adapter适配器模式(Wrapper模式)第13张
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();
    }
}
View Code

其他定义保持不变,再次运行程序,结果相同:

一天一个设计模式——Adapter适配器模式(Wrapper模式)第14张

五、相关的设计模式:

  • Bridge桥接模式:Adapter模式用于连接两个接口不同的类;而Bridge模式用于连接类的功能层次结构与实现层次结构。
  • Decorator装饰器模式:Adapter模式用于填补不同接口之间的缝隙(接口不兼容),而Decorator装饰器模式用于在不改变API接口的前提下,增强功能(Spring中的IO流,数据源,都使用了Decorator模式包装)。

免责声明:文章转载自《一天一个设计模式——Adapter适配器模式(Wrapper模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇wsdl详解C语言文件读写操作总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

autojs相关的文档地址记录和简单使用

在B站看到一个up主用autojs操作手机刷网课,觉得很有意思。在我的理解中,操作手机是需要安卓编程,甚至要ROOT手机,一系列复杂的操作。看到使用autojs能通过简单的API,并且不需要ROOT就能操作手机,顿时对autojs非常有兴趣。 ​ 原本autojs是在github上开源的,作者说因为灰色产业,停止了开源的autojs的更新,转而开始了收费的...

查看IP和MAC地址的命令

[基于MS]查看MAC地址命令: 1、使用ipconfig /all,可以看到具体配置。(查看IP地址,网关,DNS MAC地址等) 2、如果和局域网中的其它计算机通信过的话,可以用arp -a命令查看其MAC地址。 3、另外还可以用nbtstat -a [IP],不过只能查看某台具体机器的MAC地址(查看其他机器的MAC地址)。 [基于MS]查看IP地...

win10开机就占用了50%内存,win10越用越卡

刚从公司领电脑的时候16G的内存,开机占了15%左右,用了8个月,开机啥程序不开就用了50%多的内存,我只说下解决了我的问题方法 有2个,我总结了就是window更新文件太多了,我也不知道为啥为占运存,直接上解决方案,有2个方面,首先第一个方面: 第一 :win+R 输入 cleanmgr.exe   ,确定后选择C盘,选择红色框里的所有,然后确定 第二:...

ChipScope——ISE软件的抓波形操作

  Quartus II 下抓波形为 SignalTap,Vivado 下为 ila,而 ISE 下则为 ChipScope。目前 ISE 已经停止更新了,不再支持 Xilinx 的新芯片,但有些老的工程还是要用到 ISE 来开发维护,固在此以串口通信的工程为背景,记录一下 ChipScope 的使用过程。 1、新建管脚约束文件“toppin.ucf”...

《Excel VBA编程开发》附加内容1:VBA生成GUID

  1.1 VBA生成GUID 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成...

ImportError: No module named arcpy

好久没写Python脚本了,今天一运行就报错:未找到名称为 arcpy 的模块(ImportError: No module named arcpy)。 多半是环境变量出问题了,Python最令人讨厌的就是版本与编码问题了。仔细看了一下,电脑上多了一个Python2.5,这一定是安装CityEngine时安装上的,于是把Python2.5卸载,修复原来的...