适配器模式的本质及分类

合集下载

适配器模式的三种形式

适配器模式的三种形式

适配器模式的三种形式适配器模式,顾名思义,就是把原本不兼容的接⼝,通过适配,使之兼容。

举个⽣活中简单的例⼦,以前的⼿机内存卡可以取出来,但是想和电脑之间传输⾳乐、视频等资料不能直接传输,需要通过USB读卡器,然后插⼊USB接⼝就可以传输了,这个USB读卡器就相当于适配器。

你经常使⽤的⼿机或电脑充电器,也属于适配器,它将220V的交流电转换为⼿机可⽤的直流电。

下⾯,以⼿机充电器为例讲解适配器模式。

适配器模式⼀般分为三类:类适配器模式、对象适配器模式、接⼝适配器模式(缺省适配器模式)⼀、类适配器模式⼀般⼿机充电器输出的直流电压为5V,我们把交流电220V称为源,希望得到的直流电5V称为⽬标,⽽充电器即为适配器。

//源,交流电public class AC {public int outputAC(){return 220;}}//⽬标接⼝,直流电public interface IDC {public int outputDC();}//适配器public class ClsAdapter extends AC implements IDC{@Overridepublic int outputDC() {return outputAC()/44; //直流电为交流电的电压值除以44}public static void main(String[] args) {ClsAdapter adapter = new ClsAdapter();System.out.println("交流电电压:" + adapter.outputAC());System.out.println("直流电电压:" + adapter.outputDC());}}/**输出结果为:交流电电压:220直流电电压:5*/可以看到,类适配器是通过继承源类,实现⽬标接⼝的⽅式实现适配的。

但是,由于Java单继承的机制,这就要求⽬标必须是接⼝,有⼀定的局限性。

java设计模式-适配器模式

java设计模式-适配器模式

java设计模式-适配器模式java适配器模式1、概述 什么是适配器模式? 适配器模式是⼀种结构型设计模式。

适配器模式就是:把⼀个类的接⼝变换成客户端所期待的另⼀种接⼝,从⽽使原本因接⼝不匹配⽽⽆法在⼀起⼯作的两个类能够在⼀起⼯作。

⽤电器来打个⽐喻:有⼀个电器的插头是三脚的,⽽现有的插座是两孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。

适配器模式涉及3个⾓⾊:源(Adaptee):需要被适配的对象或类型,相当于插头。

适配器(Adapter):连接⽬标和源的中间对象,相当于插头转换器。

⽬标(Target):期待得到的⽬标,相当于插座。

2、适配器模式UML图 图⽚来⾃⽹络 通过上⾯UML图可以知道,客户端期待的接⼝或者对象通过适配器的转换得到了满⾜,Adapter通过内部包装Adaptee对象把源对象转换成客户端期待的对象。

3、适配器模式分类 适配器模式包括3种形式:1. 类适配器模式:类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配2. 对象适配器模式:对象适配器使⽤的是组合的⽅式,⼦孙类都可以被适配。

另外,对象适配器对于增加⼀些新⾏为⾮常⽅便,⽽且新增加的⾏为同时适⽤于所有的源。

3. 接⼝适配器模式(⼜称缺省适配器模式):接⼝适配器模式(缺省适配模式)基本思想是,为⼀个接⼝提供缺省实现,这样⼦类可以从这个缺省实现进⾏扩展,⽽不必从原有接⼝进⾏扩展。

可以说对象适配器模式是另外6种结构型设计模式的起源(图⽚源⾃⽹络)。

4、三种适配器模式详解 适配器模式的三种实现⽅式及代码实例详解,⽤电器来打个⽐喻:有⼀个电器的插头是两脚的,⽽现有的插座是三孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。

图⽚源⾃⽹络4.1、类适配器模式 类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配,请看代码实例 1.⾸先我们有⼀个要被适配的类/*** 源(相当于两脚插头,也就是被适配的类)* @author ningbeibei*/public class Adaptee {public void adapteeMethod() {System.out.println("两脚插头,被适配的类....");}} 2.定义⼀个⽬标接⼝/*** ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)* 相当于三孔插板* @author ningbeibei*/public interface Target {void targetMethod(); 3.定义适配器类 定义适配器类通过继承 Adaptee 和实现 Target 接⼝关联起来,/*** 类适配器模式(相当于转换器)* 通过Adapter类把Adaptee类与Target接⼝衔接起来* @author ningbeibei*/public class Adapter extends Adaptee implements Target {@Overridepublic void targetMethod() {//操作处理adapteeMethod();//操作处理}} 4.测试代码/*** 适配器模式测试类* @author ningbeibei*/public class test {public static void main(String[] args) {//类适配器模式Adapter adapter = new Adapter();adapter.targetMethod();}} 5.运⾏结果4.2、对象适配器模式 对象适配器使⽤的是组合的⽅式,它把源类作为属性放⼊适配器类中,请看代码实例 1.定义被适配的类/*** 源(相当于两脚插头,也就是被适配的类)* @author ningbeibei*/public class Adaptee {public void adapteeMethod() {System.out.println("两脚插头,被适配的类....");}} 2.定义⽬标接⼝/*** ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)* 相当于三孔插板* @author ningbeibei*/public interface Target {void targetMethod();} 3.定义适配器类(类似于转换器) 注意:通过持有Adaptee属性建⽴与Target接⼝联系/*** 对象适配器模式(相当于转换器)* 通过持有Adaptee属性建⽴与Target接⼝联系* @author ningbeibei*/public class Adapter implements Target {//添加属性private Adaptee adaptee;public Adapter (Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void targetMethod() {//操作处理adaptee.adapteeMethod();//操作处理} 4.测试类/*** 适配器模式测试类* @author ningbeibei*/public class test {public static void main(String[] args) {//对象适配器模式Adapter adapter = new Adapter(new Adaptee());adapter.targetMethod();}} 5.结果输出4.3、接⼝适配器模式(缺省适配模式) 接⼝适配器模式⼜称缺省模式,这种模式通过抽象类对接⼝进⾏实现,在抽象类种对接⼝进⾏默认实现。

Java设计模式之适配器模式

Java设计模式之适配器模式

一、适配器模式定义Adapter,将一个类的接口转换成客户希望的另外一个接口。

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

二、详细说明通常,客户类(clients of class)通过类的接口访问它提供的服务。

有时,现有的类(existing class)可以提供客户类的功能需要,但是它所提供的接口不一定是客户类所期望的。

这是由于现有的接口太详细或者缺乏详细或接口的名称与客户类所查找的不同等诸多不同原因导致的。

在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这样保证了对现有类的重用。

如果不进行这样的转化,客户类就不能利用现有类所提供的功能。

适配器模式(Adapter Pattern)可以完成这样的转化。

适配器模式建议定义一个包装类,包装有不兼容接口的对象。

这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。

适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。

换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。

因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。

三、Adapter的分类适配器总体上可以分为两类,类适配器(Class Adapter)和对象适配器(Object Adapter)类适配器:类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。

当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。

对象适配器:对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。

当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。

适配器设计模式

适配器设计模式
定义:
把一个类的接口变换成客户端所期待的另一种接 口,从而使原本因接口不匹配而无法在一起工作的两 个类能够在一起工作。又称为转换器模式、变压器模 式、包装(Wrapper)模式(把已有的一些类包装起 来,使之能有满足需要的接口)。
模式中的角色: 目标接口(Target):客户所期待的接口。目标可 以是具体的或抽象的类,也可以是接口。 需要适配的类(Adaptee):需要适配的类或适配 者类。 适配器(Adapter):通过包装一个需要适配的对 象,把原接口转换成目标接口。
THANKS!!!
Байду номын сангаас
优点
缺点

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




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




1、通过适配器,客户端可以调用同一接口,因而对 客户端来说是透明的。这样做更简单、更直接、更紧凑。 2、复用了现存的类,解决了现存类和复用环境要求 不一致的问题。 3、将目标类和适配者类解耦,通过引入一个适配器 类重用现有的适配者类,而无需修改原有代码。 4、 一个对象适配器可以把多个不同的适配者类适 配到同一个目标,也就是说,同一个适配器可以把适配 者类和它的子类都适配到目标接口。

适配器模式

适配器模式

Adapter pattern问题引出:大家生活中可能碰到的一个问题就是你新买的手机自带的耳机是2.5接口的,不幸的是有一天你的耳机坏了,你去市面上根本就找不到2.5的耳机了,基本上是3.5接口了,没办法你只好买了个3.5接口的耳机,老板告诉你:“我给你一个适配器”这不问题就解决了。

问题分析:3.5的接口的耳机在你手机上本来是没法使用的,因为它没有按照2.5接口的设计啊,而现在我又想使用这幅耳机,于是乎有了“适配器(Adapter)”这个一个东西出来了。

Adapter模式的定义:把一个类的接口变换成客户端所期待的另外一种接口,使得原本由于接口不兼容而不能再一起工作的那些类可以一起工作。

适配器模式分类:1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现)3.缺省的适配器模式类的适配器类图:模式的构成:以问题中例子为模型目标抽象角色(Target):定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用的耳机的接口是2.5的,在这里就可以抽象出来一个2.5接口的设备(并不一定是耳机)。

源角色(Adaptee):需要被适配的接口,在这里指的是我们从市场上买回来的那个3.5接口的耳机。

适配器角色(Adapter):用来把源接口转换成符合要求的目标接口的设备,在这里指的是老板送给我们的那个“转换器”。

客户端(Client):这里指的就是那个给我们带来麻烦的手机喽。

示例代码:Java代码1.//Target2.3.package pattern.adapter;4.5.public interface Target {6.7. public void provide2_5();8.9.}10.11.//Adaptee12.13.package pattern.adapter;14.15.public class Adaptee {16.17. public void provide3_5(){18.19. System.out.println("我是一个3.5的接口哦");20.21. }22.23.}24.25.//Adapter26.27.package pattern.adapter;28.29.public class Adapter extends Adaptee implements Target {30.31. @Override32.33. public void provide2_5() {34.35. this.provide3_5();36.37. }38.39.}40.41.//Client42.43.package pattern.adapter;44.45.public class CellPhoneClient {46.47. public static void main(String[] args) {48.49. Target target = new Adapter();50.51. //该手机只支持2.5接口的耳机52.53. target.provide2_5();54.55. }56.57.}输出结果:我是一个3.5的接口哦从输出结果可以看出只支持2.5接口的手机成功的使用3.5的耳机了。

设计模式之适配器模式

设计模式之适配器模式

适配器模式
1.模式定义
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。

适配器模式既可以作为类结构型模式,也可以作为对象结构型模式
定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合
2.模式结构
类适配器:
对象适配器:
适配器模式包含如下角色:
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
3.模式优缺点
适配器模式优点:
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。

(2)增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。

(3)灵活性和扩展性非常好。

(4)类适配器模式:置换一些适配者的方法很方便。

(5)对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类。

缺点:
类适配器模式:
(1)一次最多只能适配一个适配者类,不能同时适配多个适配者。

(2)适配者类不能为最终类.
(3)目标抽象类只能为接口,不能为类。

对象适配器模式:在适配器中置换适配者类的某些方法比较麻烦。

4.实例一
先需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry(),机器人移动方法move()等。

如果希望在不修改原有的代码的基础上使得机器人能够像狗一样叫,像狗一样跑,像鸟一样叫,像鸟一样飞,可以使用适配器模式进行系统设计。

实例类图
代码如下:。

第一节:适配器设计模式

第一节:适配器设计模式

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

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

一文彻底弄懂适配器模式(Adapter)

一文彻底弄懂适配器模式(Adapter)

⼀⽂彻底弄懂适配器模式(Adapter)⽂章已收录我的仓库:设计意图适配器模式(Adapter Pattern)是作为两个不兼容的接⼝之间的桥梁。

这种类型的设计模式属于结构型模式,它结合了两个独⽴接⼝的功能。

在某些时候,客户期望获得某种功能接⼝但现有的接⼝⽆法满⾜客户的需求,例如美国的正常供电电压为110V,⼀个中国⼈带了⼀款中国制造电器去美国,这个电器必须要在220V电压下才能充电使⽤。

这种情况下,客户(中国⼈)的期望接⼝是有⼀个220V的电压为电器充电,但实际的接⼝是仅有⼀个110V的电压供电器充电,这种情况下就需要采⽤⼀根电压转换器(适配器)使得110V的电压能够转换为220V的电压,供客户使⽤。

将⼀个类的接⼝转换成客户希望的另外⼀个接⼝,这就是适配器需要做的事情,适配器模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。

适⽤条件系统需要使⽤现有的类,⽽此类的接⼝不符合系统的需要(核⼼需求)。

想要建⽴⼀个可以重复使⽤的适配器类,⽤于与⼀些彼此之间没有太⼤关联的⼀些类,包括⼀些可能在将来引进的类⼀起⼯作,这些源类不⼀定有⼀致的接⼝,但通过适配器使得它们都具有⼀致的接⼝。

通过接⼝转换,将⼀个类插⼊另⼀个类系中。

(⽐如⽼虎和飞禽,现在多了⼀个飞虎,在不增加实体的需求下,增加⼀个适配器,在⾥⾯包容⼀个虎对象,实现飞的接⼝。

)设计通常有两种⽅式实现适配器模式,⼀种是类适配器,类适配器⽬前已不太使⽤,另⼀种实现⽅式是对象适配器,通常情况下采⽤对象适配器会使得代码更易扩展与维护。

不管采⽤何种⽅式,其基本的实现思想都是:对现有接⼝的实现类进⾏扩展,使其实现客户期望的⽬标接⼝。

类适配器通过继承现有接⼝类并实现⽬标接⼝,这样的话会使得现有接⼝类完全对适配器暴露,使得适配器具有现有接⼝类的全部功能,破坏了封装性。

此外从逻辑上来说,这也是不符合常理的,适配器要做的是扩展现有接⼝类的功能⽽不是替代,类适配器只有在特定条件下会被使⽤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

适配器模式的本质及分类
什么是适配器在计算机编程中,适配器模式(有时候也称包装样式或者包装)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式所涉及的角色有:
●目标(Target)角色:这就是所期待得到的接口。

注意:由于这里讨论的是类适配器模式,因此目标不可以是类。

●源(Adapee)角色:现在需要适配的接口。

●适配器(Adaper)角色:适配器类是本模式的核心。

适配器把源接口转换成目标接口。

显然,这一角色不可以是接口,而必须是具体类。

适配器模式的本质适配器模式的本质是:转换匹配,复用功能。

适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。

也就是说转换匹配是手段,而复用已有的功能才是目的。

在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。

适配器的分类共有两类适配器模式:
类适配器模式-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。

结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。

2. 使得Adapter可以override(重定义)Adaptee的部分行为,因为Adapter是Adaptee 的一个子类。

对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。

在这种情况下,适配器调用被包裹对象的物理实体。

相关文档
最新文档