适配器设计模式

合集下载

设计模式之适配器模式

设计模式之适配器模式

Adapter适配器模式是一种结构型模式,主要应对:由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是,新环境要求的接口是现存对象所不满足的。

《设计模式》中说道:将一个类的接口转换成客户希望的另一个接口。

Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

在实际的生活中有很多例子,如:我们常使用的移动硬盘,无论是笔记本硬盘还是台式机硬盘,对于数据的传输都不使用Usb的数据线,外接的硬盘盒就是将原来的硬盘数据传输方式适合Usb数据线。

(哎,我那个硬盘盒买的时候还190元,其实一点都不值,整个一个盒,就那个转接芯片比较值钱,我说50,人家不卖)。

我再接着说适配器模式,先举个简单的代码例子,我现在要做一个队列的类,实现先进先出的功能。

利用ArrayList对象。

首先,我们先定义一些队列的接口,接口中定义队列的方法,代码如下:interface IQueue{void push(object item); //进队列object putout(); //出队列object ShowLastItem(); //返回队列中最后一项object ShowFirstItem(); //返回队列中第一项}下面我们再来利用ArrayList对象实现一个队列:class Queue:IQueue{ArrayList adaptee;public Queue(){adaptee = new ArrayList();}publicvoid push(object item){adaptee.Add(item);}publicobject putout(){object item = adaptee[0];adaptee.RemoveAt(0);return item;}publicobject ShowLastItem(){return adaptee[adaptee.Count-1];}publicobject ShowFirstItem(){return adaptee[0];}}实现有了,现在用客户端程序调用来看一下结果:class Class1{///<summary>///应用程序的主入口点。

第一节:适配器设计模式

第一节:适配器设计模式

第⼀节:适配器设计模式
⼀、⽣活中适配器例⼦
⼆、基本介绍
1、适配器模式(Adapter Pattern)将某个类的接⼝转换成客户端期望的另⼀个接⼝表⽰,主要⽬的是兼容性,让原本因接⼝不匹配不能⼀起⼯作的两个类可以协同⼯作,⼜被称为包装器(Wrapper)。

2、适配器模式属于结构型模式;
3、主要分为三类:类适配器、对象适配器模式、接⼝适配器模式;
三、适配器模式⼯作原理
1、适配器模式:将⼀个类的接⼝转换成另⼀种接⼝,让原本接⼝不兼容的类可以兼容;
2、从⽤户的⾓度看不到被适配者,是解耦的;
3、⽤户调⽤适配器转化出来的⽬标接⼝⽅法,适配器再调⽤者被适配者的相关接⼝⽅法;
4、⽤户收到反馈结果,感觉只是和⽬标接⼝交互,如图:。

设计模式之适配器模式

设计模式之适配器模式
首先来一个IPhone的充电器类(Adaptee角色):
1 /**
2 * 充电器接口
3 */
4 public interface ICharge {
5 void charge();
6}
7
8
9 /**
10 * 苹果手机充电器需要适配的角色(Adapee)
11 */
12 public class AppleCharger implements ICharge{
1 /** 2 * 要对这个特殊的充电器进行适配,适配器接口(Target角色) 3 */ 4 public interface IChargeAdapter { 5 void charge(); 6}
创建类的适配器:
/** * 万能充电器,类的适配器(Adaper) */ public class UniversalCharger implements IChargeAdapter{
出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而 且目标类必须是抽象类。
类的适配: 这种适配器由三种角色组成: 1、目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
2、源(Adapee)角色:现在需要适配的接口。 3、适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
对象的适配: 对象的适配依赖于对象的组合,而不是类适配中的继承。
示例: 1、类适配器 故事情景:手机充电用手机充电器充电,耳机用耳机充电器充电,现在要实现给手机充电的同时也能给耳机充电。

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

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

⼀天⼀个设计模式——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 .adapterpattern;public class TypeCVideo {private String videoContent;public TypeCVideo(String videoContent){this.videoContent = videoContent;}public void typecOut(){System.out.println(videoContent);}}View CodeShowHdmiVideo类(Target对象):package .adapterpattern;public interface ShowHdmiVideo {public abstract void HdmiOut();}View CodeTypeCToHdmiCable类(Adapter类):package .adapterpattern;/*** <p>TypeCToHdmiCable TypeC转HDMI线适配器类</p>*/public class TypeCToHdmiCable extends TypeCVideo implements ShowHdmiVideo {//TypeC转HDMI线 TypeCToHdmiCable类继承了TypeCVideo类public TypeCToHdmiCable(String videoContent){super(videoContent);//设置⽗类的视频内容videoContent字段}@Overridepublic void HdmiOut() {typecOut();}}View Code测试运⾏结果:上⾯的例⼦,通过继承TypeCVideo的⽅式创建新的类,并实现新业务需要的HDMI接⼝,从⽽将TypeC中视频流(Video Streaming字符串)从HDMI接⼝输出处来。

ADAPTER设计

ADAPTER设计

ADAPTER设计适配器(Adapter)是一种设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。

适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作。

适配器通常包含两个部分:适配器类和被适配的类。

适配器类实现了客户端期望的接口,并将其方法转发给被适配类来处理。

被适配的类是原本存在的类,它拥有客户端不兼容的接口。

使用适配器的主要目的是解决接口不兼容的问题。

当我们需要使用一个已经存在的类,但是它的接口与我们所期望的接口不一致时,可以使用适配器模式。

适配器模式可以让我们重用已有的类,同时又不需要修改其原有代码。

这种模式在将不同的第三方库或组件整合到一个系统时特别有用。

适配器模式的应用场景很广泛。

例如,我们可以使用适配器将一个已有的类库适配成符合特定接口的类,以便于在我们的代码中使用。

适配器模式还可以用于将一个新的类库适配成已有的类的接口,以减少代码修改的工作量。

此外,适配器模式还可以用于系统的解耦,将不同的模块之间的接口适配成统一的接口,从而提高系统的灵活性和可维护性。

下面我们来用一个具体的例子来说明适配器设计模式的实际应用。

假设我们正在开发一个音频播放程序,它可以播放不同格式的音频文件,包括MP3、WAV和OGG。

为了实现这个功能,我们引入了一个已有的MP3播放库和一个已有的OGG播放库,但是它们的接口不兼容,我们需要将它们适配成统一的接口。

首先,我们定义一个统一的音频播放接口,包含两个方法:playMP3(和playOGG(。

然后,我们创建一个适配器类AudioPlayerAdapter,实现音频播放接口,并将其方法转发给MP3播放库和OGG播放库来处理。

最后,我们在我们的音频播放程序中使用适配器类来播放各种格式的音频文件。

适配器模式的优点是可以让我们重用已有的类,同时又不需要修改其原有代码。

这种重用的方式是通过适配器的转发机制实现的,因此适配器模式具有很好的灵活性。

另外,适配器模式还可以降低系统的耦合度,通过统一的接口来调用不同的类库或组件,从而提高系统的扩展性和维护性。

设计模式之适配器模式案例详解

设计模式之适配器模式案例详解

设计模式之适配器模式案例详解基本介绍适配器模式将某个类的接⼝转换成客户端期望的另⼀个接⼝表⽰,主要⽬的是兼容性,让原本因接⼝不匹配不能⼀起⼯作的两个类可以协同⼯作。

适配器模式属于结构性模式,主要分为三类:类适配器模式、对象适配器模式、接⼝适配器模式。

类适配器模式什么是类适配器模式类适配器模式介绍:Adapter类,通过集成src类,实现dst类接⼝,完成src>dst的适配。

应⽤实例案例以⽣活中充电器的例⼦来讲解适配器,充电器本⾝相当于Adapter,220V交流电相当于src(即被适配者),我们的dst(即⽬标)是5V 直流电。

思路分析代码实现1//被适配的类2public class Voltage220V {3//输出220V的电压4public int output220V(){5int s rc=220;6S ystem.out.println("电源电压="+src+"伏");7return s rc;8}9}1//适配接⼝2public interface IVoltage5V {3int output5V();4}1public class VoltageAdapter extends Voltage220V implements IVoltage5V {2@Override3public int output5V(){4int s rcV =o utput220V();//获取220V的电压5int d stV =s rcV /44;//进⾏处理6return d stV;7}8}1public class Phone {2//充电3public void charging(IVoltage5V i Voltage5V){4if(iVoltage5V.output5V()==5){5S ystem.out.println("现在电压为5V,可以充电");6}else if(iVoltage5V.output5V()>5){7S ystem.out.println("现在电压⼤于5V,可以充电");8}9}10}1public class Client {2public static void main(String[] a rgs){3P hone p hone =new P hone();4p hone.charging(new V oltageAdapter());5}6}类适配器模式注意事项和细节Java是单继承机制,所以类适配器需要继承src类这⼀点算是⼀个缺点,因为这要求dst必须是接⼝,有⼀定局限性。

设计模式之适配器模式

设计模式之适配器模式

设计模式之适配器模式模式动机
适配器模式的作用就是解决两个软件实体间接口不兼容状况.
通常状况下,用法者可以通过目标类的接口拜访它所提供的服务。

开头时候没有什么问题, 但是一但后续别的接口(如第三方接口)有变动或者后续扩展需求, 此时用法原有接口已经不行以提供服务, 那么我们就需要把现有接口转化为用法者需要的接口.适配器模式就是用来完成这样的转化.
在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。

模式定义
适配器模式(Adapter Pattern) :将一个接口转换成用法者希翼的
第1页共17页。

深入设计模式(三)——适配器模式

深入设计模式(三)——适配器模式

深⼊设计模式(三)——适配器模式⼀、适配器设计模式介绍适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。

Adapter模式使⽤的原本由于接⼝不兼容⽽不能茉莉花物那些可以⼀起⼯作。

⼆、解决的问题1、使⽤第三⽅组件,⽽这个组件的接⼝与⽬前系统接⼝不兼容(如⽅法与系统⽅法不⼀致等),可以使⽤适配器模式解决接⼝不兼容问题。

2、使⽤早前项⽬⼀些有⽤的类,可以⽤适配器模式解决现有接⼝与原有对象接⼝不兼容问题。

三、⽣活中的例⼦适配器模式允许将⼀个类的接⼝转换成客户期望的另⼀个接⼝,使⽤原本由于接⼝不兼容⽽不能⼀起⼯作的类可以⼀起⼯作。

扳⼿提供了⼀个适配器的例⼦。

⼀个孔套在棘齿上,棘齿的每个边的尺⼨是相同的。

在美国典型的连长为1/2和1/4。

显然,如果不使⽤⼀个适配器的话,1/2的棘齿不能适合1/4的孔。

⼀个1/2到1/4的适配器具有⼀个1/2的阴槽来套上⼀个1/2的齿,同时有⼀个1/4的阳槽来卡⼊1/4的扳⼿。

四、适配器分析1.适配器模式结构2.代码1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///客户期待的接⼝或者抽象类Target11///</summary>12public abstract class Target13 {14public abstract void Request();15 }16 }客户期待的接⼝或者抽象类Target1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///要适配的类Adaptee,也就是与期望调⽤接⼝不相符的类11///</summary>12public class Adaptee13 {14public void SpecificReques() {15 Console.WriteLine("执⾏要适配类的特殊请求⽅法");16 }17 }18 }要适配的类Adaptee,也就是与期望调⽤接⼝不相符的类1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9public class Adapter:Target10 {11private Adaptee adaptee;12public override void Request()13 {14if (adaptee == null) {15 adaptee = new Adaptee();16 }17 adaptee.SpecificReques();18 }19 }20 }适配器类Adapter,把源接⼝转换成⽬标接⼝,包⾏变量adaptee1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace适配器模式8 {9///<summary>10///适配器模式,将⼀个类装换成客户期望的另外⼀个接⼝。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义:
把一个类的接口变换成客户端所期待的另一种接 口,从而使原本因接口不匹配而无法在一起工作的两 个类能够在一起工作。又称为转换器模式、变压器模 式、包装(Wrapper)模式(把已有的一些类包装起 来,使之能有满足需要的接口)。
模式中的角色: 目标接口(Target):客户所期待的接口。目标可 以是具体的或抽象的类,也可以是接口。 需要适配的类(Adaptee):需要适配的类或适配 者类。 适配器(Adapter):通过包装一个需要适配的对 象,把原接口转换成目标接口。
THANKS!!!
Байду номын сангаас
优点
缺点

对于对象适配器来说,更换适配器的实现过程比较复杂。
适用场景




1、系统需要使用现有的类,而这些类的接口不符合 系统的接口。 2、想要建立一个可以重用的类,用于与一些彼此之 间没有太大关联的一些类,包括一些可能在将来引进的 类一起工作。 3、两个类所做的事情相同或相似,但是具有不同接 口的时候。 4、旧的系统开发的类已经实现了一些功能,但是客 户端却只能以另外接口的形式访问,但我们不希望手动 更改原有类的时候。 5、使用第三方组件,组件接口定义和自己定义的不 同,不希望修改自己的接口,但是要使用第三方组件接 口的功能。
总结: 无论哪种适配器,它的宗旨都是:保留现有类所提 供的服务,向客户提供接口,以满足客户的期望。即在 不改变原有系统的基础上,提供新的接口服务。




1、通过适配器,客户端可以调用同一接口,因而对 客户端来说是透明的。这样做更简单、更直接、更紧凑。 2、复用了现存的类,解决了现存类和复用环境要求 不一致的问题。 3、将目标类和适配者类解耦,通过引入一个适配器 类重用现有的适配者类,而无需修改原有代码。 4、 一个对象适配器可以把多个不同的适配者类适 配到同一个目标,也就是说,同一个适配器可以把适配 者类和它的子类都适配到目标接口。
适配器模式结构图<Adapter>:
分类:
1、面向类的适配器模式”。顾名思义,这类适 配器模式就是主要用于,单一的为某个类而实现适 配的这样一种模式 2、对象适配器模式——把“源”作为一个对象 聚合到适配器类中。把“源”作为一个构造参数传 入适配器,然后执行接口所要求的方法。这种适配 模式可以为多个源进行适配。弥补了类适配模式的 不足。 3、默认适配器模式——实现一个接口但又不想 实现所有接口方法,只想去实现一部分方法,则在 接口和具体实现类中添加一个抽象类,而用抽象类 去空实现目标接口的所有方法。而具体的实现类只 需要覆盖其需要完成的方法即可。
相关文档
最新文档