【设计模式】结构型模式·适配器模式

news/2023/6/9 20:17:10

学习汇总入口【23种设计模式】学习汇总(数万字讲解+体系思维导图)
写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧!

一. 概述

将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

【例】

如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。

在这里插入图片描述

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

二.使用

(1) 类适配器模式

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。

【例】读卡器

现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。

类图如下:
在这里插入图片描述

代码如下:

// 定义适配者
//SD卡的接口
public interface SDCard {//读取SD卡方法String readSD();//写入SD卡功能void writeSD(String msg);
}//SD卡实现类
public class SDCardImpl implements SDCard {public String readSD() {String msg = "sd card read a msg :hello word SD";return msg;}public void writeSD(String msg) {System.out.println("sd card write msg : " + msg);}
}//电脑类
public class Computer {public String readSD(SDCard sdCard) {if(sdCard == null) {throw new NullPointerException("sd card null");}return sdCard.readSD();}
}
//定义目标接口
//TF卡接口
public interface TFCard {//读取TF卡方法String readTF();//写入TF卡功能void writeTF(String msg);
}//TF卡实现类
public class TFCardImpl implements TFCard {public String readTF() {String msg ="tf card read msg : hello word tf card";return msg;}public void writeTF(String msg) {System.out.println("tf card write a msg : " + msg);}
}//定义适配器类(SD兼容TF)
public class SDAdapterTF extends TFCardImpl implements SDCard {public String readSD() {System.out.println("adapter read tf card ");return readTF();}public void writeSD(String msg) {System.out.println("adapter write tf card");writeTF(msg);}
}//测试类
public class Client {public static void main(String[] args) {Computer computer = new Computer();SDCard sdCard = new SDCardImpl();System.out.println(computer.readSD(sdCard));System.out.println("------------");SDAdapterTF adapter = new SDAdapterTF();System.out.println(computer.readSD(adapter));}
}
  • 说明:类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

(2) 对象适配器模式

实现方式:对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。

【例】读卡器

我们使用对象适配器模式将读卡器的案例进行改写。类图如下:
在这里插入图片描述

代码如下:

类适配器模式的代码,我们只需要修改适配器类(SDAdapterTF)和测试类。

//创建适配器对象(SD兼容TF)
public class SDAdapterTF  implements SDCard {private TFCard tfCard;public SDAdapterTF(TFCard tfCard) {this.tfCard = tfCard;}public String readSD() {System.out.println("adapter read tf card ");return tfCard.readTF();}public void writeSD(String msg) {System.out.println("adapter write tf card");tfCard.writeTF(msg);}
}//测试类
public class Client {public static void main(String[] args) {Computer computer = new Computer();SDCard sdCard = new SDCardImpl();System.out.println(computer.readSD(sdCard));System.out.println("------------");TFCard tfCard = new TFCardImpl();SDAdapterTF adapter = new SDAdapterTF(tfCard);System.out.println(computer.readSD(adapter));}
}

注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方法。而此时我们只需要继承该抽象类即可。

(3) 应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

(4) JDK源码解析

Reader(字符流)、InputStream(字节流)的适配使用的是InputStreamReader。

InputStreamReader继承自java.io包中的Reader,对他中的抽象的未实现的方法给出实现。如:

public int read() throws IOException {return sd.read();
}public int read(char cbuf[], int offset, int length) throws IOException {return sd.read(cbuf, offset, length);
}

如上代码中的sd(StreamDecoder类对象),在Sun的JDK实现中,实际的方法实现是对sun.nio.cs.StreamDecoder类的同名方法的调用封装。类结构图如下:
在这里插入图片描述

从上图可以看出:

  • InputStreamReader是对同样实现了Reader的StreamDecoder的封装。
  • StreamDecoder不是Java SE API中的内容,是Sun JDK给出的自身实现。但我们知道他们对构造方法中的字节流类(InputStream)进行封装,并通过该类进行了字节流和字符流之间的解码转换。
  • 结论:从表层来看,InputStreamReader做了InputStream字节流类到Reader字符流之间的转换。而从如上Sun JDK中的实现类关系结构中可以看出,是StreamDecoder的设计实现在实际上采用了适配器模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4564102.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

关爱自身健康,自身健康才是硬实力

杂项注意事项: 坐姿:正确的坐姿是上身挺直,收腹,下颌微收,下肢并拢。在上述姿势的基础上尽量将腰背紧贴椅背,这样腰骶部的肌肉不会太疲劳。 避免过多过度的弯腰及扭转腰椎,不可长时间进行坐位工作还是要找…

传统企业如何转型社交电商,泰山众筹的玩法有哪些?

在如今传统企业都有必要往电子商务转型,而现如今传统电商红利期也逐步地消失。传统企业想要转型,社交电商是一个可行的商业道路,而企业也要根据自己不同的需求,来寻找合适自己的转型商业模式。 模式对于自身企业非常重要&#xf…

众美集团持续创新定制服务模式 携手伙伴满足各行业客户需求

众美集团作为正在转型中的定制生活服务商,立足京津冀,辐射全国,深耕“定制服务模式”多年,持续创新,以自身实力及洞见获得了各方认可与口碑。在城镇创新领域,众美集团正积极推进涿州众美国际健康小镇建设&a…

展示中心揭幕 众美集团石家庄打造互联网+共享城市综合体

作为一个拥有32万平方米体量的综合体项目,众美定制广场是融合办公、商业、公寓等功能于一体的高端城市综合体项目,也是众美集团深耕京津冀19载、顺应城市发展大势的最新力作。2019年4月16日,众美定制广场万达展示中心盛大亮相,众多…

行业大咖到访众美集团 共话众美定制广场十大价值点

行业大咖到访众美集团 共话众美定制广场十大价值点9月6日上午,河北省不动产商会常务副会长、石家庄市房地产业协会党支部书记李水源,石家庄市房地产业协会秘书长纪珊珊携石家庄楼市全媒体观察团大V代表走进众美集团,共同开启“众赢之地 大境已…

【动态ppt制作软件】Focusky教程 | 设置预加载信息

Focusky(以下简称“FS软件”)多媒体演示制作大师允许用户自定义预加载信息,让幻灯片更具特色。在Focusky演示软件上定义预加载信息主要有两种方法: 方法一:点击菜单栏中的“编辑”,在下拉菜单上选择“选项…

【动态ppt制作软件】Focusky教程 | 如何合并Focusky工程文件?

(Focusky动画演示大师简称“FS软件”)将多个工程文件合并为一个,可以通过复制粘贴的方式来实现。下面将介绍3种复制粘贴的方法。 方法一:选中帧以及帧内物体后,点击鼠标右键选“复制”; 方法二&#xff1…

【动态ppt制作软件】Focusky教程 | 怎么让动作路径动画发挥作用

Focusky 动画演示大师(以下简称为“FS软件”)中的动画编辑器给予每一位用户自己创造动画演示文稿的机会。 在动画编辑器当中, 可以为任何物体添加各种动画特效, 其中包括进场,退场,强调特效。 另外&#xf…