历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2018年01月15日 | 适配器模式的优缺点

2018-01-15 来源:互联网

适配器是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。


一台实验室离心机通常可以配多个转子,容量大小不一。当在同一台离心机需要配同一种类但容量不一的两个转子时,可以考虑在大容量的试管孔里放一个适配器以达到适合小容量试管的试管孔,这样就只需要配上大容量的转子加上一套适配器就可以满足要求了,这样既可以免除换转子时拆卸的复杂工序,又节约金钱,因为一套适配器的价格远远低一个转子的价格。


适配器模式的优缺点


Java 适配器模式


适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作。从功能上说,这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模式就会派上用场了。


适配器的优点:


1、将目标类和适配者类解耦


2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性


3、灵活性和扩展性都非常好,符合开闭原则


适配器所涉及的角色包括下面几种:


目标(Target):定义一个客户端使用的特定接口。


客户端(Client):使用目标接口,与和目标接口一致的对象合作。


被适配者(Adaptee):一个现存需要适配的接口。


适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。


适配器分为类适配器和对象适配器两种,下面将详细讲述。


类适配器


所谓类适配器,指的是适配器Adapter继承我们的被适配者Adaptee,并实现目标接口Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee。代码如下:


被适配者(Adaptee)


16package com.bluemsun.classadapter;


public class Person {


private int id;


private String name;


/**


* person可以现在只能说英语


*/


public void sayEnglish(){


System.out.println(“Person can say english!”);


}


/**


* 省略setter,getter.


*/


}


目标接口(Target)


package com.bluemsun.classadapter;


/**


* 目标要求person可以说英语,法语,日语。但是现在的person仅仅可以说英语


* @author Administrator


*


*/


public interface Target_Person {


void sayEnglish();


void sayFrench();


void sayJapanese();


}


适配器(Adapter)


package com.bluemsun.classadapter;


/**


* 类适配器,因为继承了Person,而Java中只能单继承,所以这个适配器只为person这一个类服务


* 这个适配器就让person类在不修改源码的基础上能实现目标接口所指定的方法


* @author Administrator


*


*/


public class Adapter_Person extends Person implements Target_Person{


@Override


public void sayFrench() {


System.out.println(“Person can say French!”);


}


@Override


public void sayJapanese() {


System.out.println(“Person can say Japanese!”);


}


}


客户端(Client)


package com.bluemsun.classadapter;


public class Test {


public staTIc void main(String[] args) {


Target_Person person = new Adapter_Person();


person.sayEnglish();


person.sayFrench();


person.sayJapanese();


}


}


上面的几段简单代码演示了类适配器的作用。正如我们开始所言,这个适配器Adapter只能为Person这一个类所服务。这时候你可能会想,要是我所需要适配的类很多,是不是都需要为每一个需要适配的类写一个Adapter?有没有更加灵活的方式呢?答案是:有!就是我们下面所讲的对象适配器。


对象适配器


所谓对象适配器,简单的说就是适配器实现我们的目标接口,但是并不继承需要被适配的类。而是通过在适配器的构造函数中将需要被适配的类传递进来从而进行适配。代码如下:(Target,Adaptee同上)


适配器(Adapter)


package com.bluemsun.objectdapter;


import com.bluemsun.classadapter.Person;


import com.bluemsun.classadapter.Target_Person;


/**


* 对象适配器,与类适配器不同的是:对象适配器可以适配多个源到目标


* @author Administrator


*


*/


public class Adapter_Person implements Target_Person{ //仅仅实现目标接口


private Person person;


//在构造函数中将Adaptee类Person传递进来


public Adapter_Person(Person person){


this.person = person;


}


//实现目标接口中的sayEnglish()--调用Adaptee中的sayEnglish()


@Override


public void sayEnglish() {


this.person.sayEnglish();


}


//实现接口中的其它方法


@Override


public void sayFrench() {


System.out.println(“person can say French!”);


}


@Override


public void sayJapanese() {


System.out.println(“person can say Japanese!”);


}


}


客户端(Client)


package com.bluemsun.objectdapter;


import com.bluemsun.classadapter.Person;


import com.bluemsun.classadapter.Target_Person;


public class Test {


public staTIc void main(String[] args) {


Target_Person person = new Adapter_Person(new Person());


person.sayEnglish();


person.sayFrench();


person.sayJapanese();


}

}


对象适配器可以适配多个带适配的类。只需要你在Adapter的构造方法中传递不同的带适配的类即可。具有灵活性。


类适配器的优点:


1、由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。


类适配器的缺点:


1、对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。


对象适配器的优点:


1、把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。


对象适配器的缺点:


1、与类适配器模式相比,要想置换适配者类的方法就不容易。

推荐阅读

史海拾趣

广东爱晟电子(exsense)公司的发展小趣事

随着业务的不断拓展,爱晟电子意识到品质是品牌的核心。公司引进了先进的生产设备和管理体系,严格按照ISO9001质量体系运作,确保产品质量的稳定性和可靠性。同时,公司还加强了对原材料的质量控制,与国内外优质供应商建立了长期稳定的合作关系。这些举措使得爱晟电子的产品在市场上赢得了良好的口碑,品牌影响力逐渐增强。

Hirel Systems Ltd公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,爱晟电子始终坚持以创新驱动发展。公司不断投入研发资金,加强研发团队的建设,推动技术的不断进步和创新。同时,公司还积极探索新的应用场景和市场领域,为未来的发展奠定了坚实的基础。这些努力使得爱晟电子在电子行业中保持了持续的发展势头和竞争力。

Franz Binder GmbH & Co公司的发展小趣事

2020年新冠疫情期间,爱晟电子积极响应政府号召,全力支持抗疫工作。公司不仅向抗疫一线捐赠了防疫物资,还组织员工参与志愿服务。同时,公司还利用自身的技术优势,研发出适用于医疗设备的NTC热敏电阻,为抗击疫情提供了有力支持。这些行动彰显了爱晟电子的社会责任感和担当精神。

ETERNA公司的发展小趣事

除了在制表业取得显著成就外,ETERNA还在生物技术领域进行了积极探索。公司利用专有的非病毒、非DNA方法,使用mRNA进行细胞重编程研究。这一技术旨在通过表达特定的蛋白质来逆转细胞的老化过程,实现“倒转时钟”的效果。虽然ETERNA在mRNA领域的具体成果尚未对外公布,但其在该领域的探索精神和技术实力已经引起了业界的广泛关注。

Dynachip Corp公司的发展小趣事

Dynachip Corp始终将创新作为公司发展的核心动力。他们不断投入研发资源,探索新的技术方向和应用场景。同时,他们还积极关注行业动态和市场趋势,及时调整产品策略和市场布局。这种持续创新的精神使Dynachip Corp能够保持在行业中的领先地位,并为未来的发展奠定了坚实的基础。展望未来,Dynachip Corp将继续秉承创新、品质、合作的理念,致力于成为全球领先的半导体企业。

Hirect公司的发展小趣事
根据输入电源和输出电压的需求,选择合适的变压器电压等级。

问答坊 | AI 解惑

正弦波信号发生器VHDL源代码

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 拿出来恭喜  …

查看全部问答>

50Mhz分频的问题

怎么将50M的时钟分频成153600hz? 用普通的方法好像不能解决,因为除不尽。 我设想用一个pll,倍频后,再分 高手指教…

查看全部问答>

有操作系统的嵌入式设备和没有操作系统的嵌入式设备之间的区别

有操作系统的嵌入式设备和没有操作系统的嵌入式设备之间的区别,以及有操作系统的嵌入式设备的优点是什么??…

查看全部问答>

初学者问几个问题,关于wince与arm,望高人指教

首先,我用的是微芯力科的ws-430评估板,cpu为at91rm9200,要求用wince开发。 评估板附带的资料只有linux以及ucos系统的,没有wince的资料,打电话到微芯力科公司,被告知该板不支持wince,因为wince要求某尺寸的真彩屏幕,而我的板子上是一个128 ...…

查看全部问答>

如何验证下位机的串行发送程序

我现在没有芯片,只是在keilc中写的串行通信程序,我想验证一下它能不能实现发送字节,只有一台的情况下该如何做?其中发送字节程序是? void sendbyte(unsigned char word) { SBUF=word; while(TI==0);   TI=0; } …

查看全部问答>

原以为写个usb驱动很简单

DOS下的usb storage驱动一个比一个不好用,我一急就决定自己写一个,结果搞了20天了,还一头浆糊,怎么办。想来想去还是原始社会好啊…

查看全部问答>

AD快捷键大全

挺全的,ad6的快捷键大全,很实用的…

查看全部问答>

如何使用MSP430外部计数信号TACLK

急求高手指点,我的做法是引脚TACLK连接外部频率信号,对外部信号直接计数,不知道为什么总是得不到计数值。 MSP430F2274 P1SEL |= BIT0; P1DIR &= ~BIT0; TACTL = TASSEL_0 + ID_0 + MC_2;…

查看全部问答>

空中鼠标-MSP-EXP430FR5739实验板实现

玩跑跑卡丁车突发奇想,可不可以用团购来的MSP-EXP430FR5739实验板来控制赛车!基本思路是这样的,利用EXP430FR5739实验板上的三轴加速度传感器来检测前后左右上下位置信息,利用串口发送到上位机程序,上位机软件是在VS2010下写的MFC程序,利用该 ...…

查看全部问答>

Kinetis KE06 GPIO测试

Kinetis KE06 GPIO测试 IDE-Version: μVision V5.11.1.0 例程包:KEXX_DRIVERS_V1.2.1_DEVD.RAR 该包用鼠标右键的“解压文件” ,解压后的文件名还是这个,不然DOWN时会出错! 1、打开例程 相关文件:gpio.c,gpio.h主要GPIO操作都在 ...…

查看全部问答>