适配器模式的本质及分类
- 格式:doc
- 大小:15.00 KB
- 文档页数:2
适配器模式的三种形式适配器模式,顾名思义,就是把原本不兼容的接⼝,通过适配,使之兼容。
举个⽣活中简单的例⼦,以前的⼿机内存卡可以取出来,但是想和电脑之间传输⾳乐、视频等资料不能直接传输,需要通过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适配器模式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、接⼝适配器模式(缺省适配模式) 接⼝适配器模式⼜称缺省模式,这种模式通过抽象类对接⼝进⾏实现,在抽象类种对接⼝进⾏默认实现。
一、适配器模式定义Adapter,将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
二、详细说明通常,客户类(clients of class)通过类的接口访问它提供的服务。
有时,现有的类(existing class)可以提供客户类的功能需要,但是它所提供的接口不一定是客户类所期望的。
这是由于现有的接口太详细或者缺乏详细或接口的名称与客户类所查找的不同等诸多不同原因导致的。
在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这样保证了对现有类的重用。
如果不进行这样的转化,客户类就不能利用现有类所提供的功能。
适配器模式(Adapter Pattern)可以完成这样的转化。
适配器模式建议定义一个包装类,包装有不兼容接口的对象。
这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。
适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。
换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。
因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。
三、Adapter的分类适配器总体上可以分为两类,类适配器(Class Adapter)和对象适配器(Object Adapter)类适配器:类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。
当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。
对象适配器:对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。
当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。
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 Pattern)是作为两个不兼容的接⼝之间的桥梁。
这种类型的设计模式属于结构型模式,它结合了两个独⽴接⼝的功能。
在某些时候,客户期望获得某种功能接⼝但现有的接⼝⽆法满⾜客户的需求,例如美国的正常供电电压为110V,⼀个中国⼈带了⼀款中国制造电器去美国,这个电器必须要在220V电压下才能充电使⽤。
这种情况下,客户(中国⼈)的期望接⼝是有⼀个220V的电压为电器充电,但实际的接⼝是仅有⼀个110V的电压供电器充电,这种情况下就需要采⽤⼀根电压转换器(适配器)使得110V的电压能够转换为220V的电压,供客户使⽤。
将⼀个类的接⼝转换成客户希望的另外⼀个接⼝,这就是适配器需要做的事情,适配器模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。
适⽤条件系统需要使⽤现有的类,⽽此类的接⼝不符合系统的需要(核⼼需求)。
想要建⽴⼀个可以重复使⽤的适配器类,⽤于与⼀些彼此之间没有太⼤关联的⼀些类,包括⼀些可能在将来引进的类⼀起⼯作,这些源类不⼀定有⼀致的接⼝,但通过适配器使得它们都具有⼀致的接⼝。
通过接⼝转换,将⼀个类插⼊另⼀个类系中。
(⽐如⽼虎和飞禽,现在多了⼀个飞虎,在不增加实体的需求下,增加⼀个适配器,在⾥⾯包容⼀个虎对象,实现飞的接⼝。
)设计通常有两种⽅式实现适配器模式,⼀种是类适配器,类适配器⽬前已不太使⽤,另⼀种实现⽅式是对象适配器,通常情况下采⽤对象适配器会使得代码更易扩展与维护。
不管采⽤何种⽅式,其基本的实现思想都是:对现有接⼝的实现类进⾏扩展,使其实现客户期望的⽬标接⼝。
类适配器通过继承现有接⼝类并实现⽬标接⼝,这样的话会使得现有接⼝类完全对适配器暴露,使得适配器具有现有接⼝类的全部功能,破坏了封装性。
此外从逻辑上来说,这也是不符合常理的,适配器要做的是扩展现有接⼝类的功能⽽不是替代,类适配器只有在特定条件下会被使⽤。
带大家了解android中的适配器模式在android学习过程中,我相信ListView必定是让大家十分头痛的组件,原因很简单,这里有个适配器的概念,对于学生来讲是一个从未涉及的新的领域,所以我在这里写了本篇文章,目的是带大家了解android中的适配器模式,为你的学习之路铺平道路。
1.适配器模式的定义:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatile interfaces.将一个类的接口变成客户端所期待的另一中接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
其中用到适配器模式的经典例子就是插座匹配问题,直接给图:2.适配器模式的分类:适配器模式主要分为两种:类适配器和对象适配器如上图所示(截取自《Head First Design Patterns》一书),主要包括三个部分:1) Target目标角色。
该角色定义把其他类转换为我们的期待接口。
2) Adaptee源角色。
就是原始的类和接口对象,它是已经存在的,只是不符合现有的要求,而需要利用适配器角色的包装。
3) Adapter适配器角色。
适配器模式的核心角色,其它两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单;把源角色转换为目标角色;通过继承或是组合的方式。
3.适配器模式的优势:1)适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定它们。
2)增加了类的通透性,我们访问的Target目标角色,但是具体的实现都委托给了源角色,而这些对高层次模块是透明的,也是它不需要关心得。
3)调高了类的复用性和灵活性非常好。
如果觉得适配器不够好,只要修改适配器就行,其它的代码都不用修改,适配器就是一个灵活的构件,想用就用。
适配器模式(adapter)1.适配器模式(Adapter)的定义:在软件开发中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境的接口是现存对象所不满足的。
那么如何应对这种“迁移的变化”呢?如何利用现有对象的良好实现,同时又满足新的应用环境所要求的接口?这里说得就是Adapter模式。
2.意图:将一个类的接口转换成客户希望的另外一个接口,Adapter使得原本由于接口不兼容而不能一起工作的类可以一起共工作。
3.适配器模式的构成:1)目标抽象角色(Target):定义客户要用的特定领域的接口2)适配器(Adapter):调用另一个接口,作为转换器3)适配器(Adaptee):定义一个接口,Adapter需要接入4)客户端(Client):协同对相符合Adapter适配器4.适配器的分类:1)类适配器(采用集成的方式)2)对象适配器(采用对象组合的方式)-推荐3)缺省的适配器模式(AWT,Swing事件模型采用的模式)5.使用的场合:第一,对象需要使用现存的并且接口不兼容的类;第二,需要创建可重用的类以协调其他接口可能不兼容的类。
6.案例(通过类的继承模式):1)目标抽象角色(Target):package com.abao.adapter;public interface Target{public void method1();}2)适配器-Adapter需要接入:package com.abao.adapter;public class Adaptee{public void method2(){System.out.println("目标方法");}}3)适配器(Adapter):package com.abao.adapter;public class Adapter extends Adaptee implements Target {@Overridepublic void method1(){this.method2();}}4)客户端(Client):package com.abao.adapter;public class Client{public static void main(String[] args){Target target = new Adapter();target.method1();}}7.Junit中使用的额适配器模式:1)Junit在TestCase类中应用了适配器(Adapter)模式:2)在runBare方法中,通过runTest方法经我们自己编写的testXXX方法进行的适配,使得junit可以执行我们自己编写的Test Case,runTest方法的实现如下:8.案例(使用对象组合的方式实现适配器) 1)目标抽象角色(Target):package com.abao.adapter;public interface Target{public void method1();}2)适配器-Adapter需要接入:package com.abao.adapter;public class Adaptee{public void method2(){System.out.println("目标方法");}}3)适配器(Adapter)-这个地方就不是采用继承:package com.abao.adapter1;public class Adapter implements Target{private Adaptee adaptee;public Adapter(Adaptee adaptee){this.adaptee = adaptee;}@Overridepublic void method1(){adaptee.method2();}}4)客户端(Client):package com.abao.adapter1;public class Client{public static void main(String[] args){Target target = new Adapter(new Adaptee());target.method1();}}9.案例(缺省的适配器模式):1)抽象的接口服务角色:package com.abao.defaultadapter;public interface AbstractService{public void service1();public void service2();public void service3();}2)适配器角色(和swing比较几乎一样):package com.abao.defaultadapter;public class ServiceAdapter implements AbstractService {@Overridepublic void service1(){}@Overridepublic void service2(){}@Overridepublic void service3(){}}3)具体的服务角色:package com.abao.defaultadapter;public class ConcreteService extends ServiceAdapter{@Overridepublic void service1(){System.out.println("执行业务方法");}}10.上面的适配器模式和AWT、swing中的适配器的模式实现是完全一样的。
适配器模式的本质及分类
什么是适配器在计算机编程中,适配器模式(有时候也称包装样式或者包装)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
适配器模式所涉及的角色有:
●目标(Target)角色:这就是所期待得到的接口。
注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
●源(Adapee)角色:现在需要适配的接口。
●适配器(Adaper)角色:适配器类是本模式的核心。
适配器把源接口转换成目标接口。
显然,这一角色不可以是接口,而必须是具体类。
适配器模式的本质适配器模式的本质是:转换匹配,复用功能。
适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。
也就是说转换匹配是手段,而复用已有的功能才是目的。
在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。
适配器的分类共有两类适配器模式:
类适配器模式-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。
结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
2. 使得Adapter可以override(重定义)Adaptee的部分行为,因为Adapter是Adaptee 的一个子类。
对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。
在这种情况下,适配器调用被包裹对象的物理实体。