JavaAdapter适配器模式(类适配器,对象适配器)优缺
点对⽐
Java 适配器模式
最近学习java 基础知识,学习适配器的时候疑惑很多,上⽹查下资料,对于 Adapter的资料很多,但是⽐较下本篇不错,这⾥记录下,⼤家需要的可以看下。
适配器模式就是把⼀个类的接⼝转换成客户端所期待的另外⼀种接⼝,从⽽使原接⼝不匹配⽽⽆法在⼀起⼯作的的两个类能在⼀起⼯作。从功能上说,这些接⼝不兼容的类⼀般具有相同或相似的功能。通常我们通过修改该类的接⼝来解决这种接⼝不兼容的情形,但是如果我们不愿意为了⼀个应⽤⽽修改各原接⼝,或者我们压根⼉就没有对象的源代码的时候,适配器模式就会派上⽤场了。
适配器的优点:
1、将⽬标类和适配者类解耦
2、增加了类的透明性和复⽤性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,⽽且提⾼了适配者的复⽤性
3、灵活性和扩展性都⾮常好,符合开闭原则
适配器所涉及的⾓⾊包括下⾯⼏种:
⽬标(Target):定义⼀个客户端使⽤的特定接⼝。
客户端(Client):使⽤⽬标接⼝,与和⽬标接⼝⼀致的对象合作。
被适配者(Adaptee):⼀个现存需要适配的接⼝。
适配器(Adapter):负责将Adaptee的接⼝转换为Target的接⼝。适配器是⼀个具体的类,这是该模式的核⼼。
适配器分为类适配器和对象适配器两种,下⾯将详细讲述。
类适配器
所谓类适配器,指的是适配器Adapter继承我们的被适配者Adaptee,并实现⽬标接⼝Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee。代码如下:
被适配者(Adaptee)
package 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、与类适配器模式相⽐,要想置换适配者类的⽅法就不容易。
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。