java 适配器模式示例
一、定义
适配器模式用于解决接口间的兼容问题。
当我们需要使用某个类提供的接口,但是这个接口与现在的系统需求不符,由于该接口是由第三方提供的,或者是已经在生产上跑了很久的存量类,我们不想通过改变这个类来满足现在系统的需求,那么这时候就可以考虑通过将目标类封装成一个满足系统需求的新类,因此适配器(Adapter)也称为包装器(Wrapper)。
二、示例
平常生活中手机耳机插口慢慢开始从3.5mm接口换成了typec接口,但是还有3.5mm的耳机需要在Type-C上的手机使用,这个时候就需要个转接头,这就是适配模式,下面将用代码实现:
2.1 目标接口
package com.xy.adapter.headset;
/**
* typec 接口
*/
public interface TypeCInterface {
/**
* 插入typec接口
*/
void typec();
}
2.2 适配者类(被适配的对象)
/**
* @Description: 3.5接口耳机
* @author: xy
* @date: 2022年10月10日 17:18
*/
public class HeadPhoneThreePointFive {
/**
* 插入3.5mm毫米接口
*/
void threePointFive(){
System.out.println("插入耳机3.5mm接口");
}
}
2.3 适配器(对象适配器模式)
package com.xy.adapter.headset;
/**
* @Description: 耳机适配器(装接头) 对象适配器模式
* @author: xy
* @date: 2022年10月10日 17:16
*/
public class HeadPhoneAdapter implements TypeCInterface{
private HeadPhoneThreePointFive headPhoneThreePointFive;
HeadPhoneAdapter(HeadPhoneThreePointFive headPhoneThreePointFive){
this.headPhoneThreePointFive = headPhoneThreePointFive;
}
@Override
public void typec() {
System.out.println("插入耳机转接头typec接口~");
headPhoneThreePointFive.threePointFive();
}
}
2.4 适配器 (类适配器模式)
package com.xy.adapter.headset;
/**
* @Description: 耳机适配器(装接头) 类适配器模式
* @author: xy
* @date: 2022年10月10日 17:16
*/
public class HeadPhoneAdapter2 extends HeadPhoneThreePointFive implements TypeCInterface {
@Override
public void typec() {
System.out.println("插入耳机转接头typec接口~");
super.threePointFive();
}
}
2.5 类适配器和对象适配器区别
类适配器:适配器Adapter继承我们的被适配者Adaptee,并实现目标接口Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee。优点是适配器中可以复写被适配者方法,使得适配器更加灵活,缺点是java中只支持单继承,所以这个适配器只能为单个适配者服务
对象适配器:适配器Adapter实现目标接口Target,将被适配者Adatee使用组合的方式,通过适配器构造函数传递进来。优点是因为是组合的方式,所以可以将多个适配者适配到同一目标,缺点:如果要复写适配者的功能就不容易。
总结:尽量使用对象适配器的实现方式,多用组合、少用继承。
2.6 运行
package com.xy.adapter.headset;
/**
* @Description: 手机
* @author: xy
* @date: 2022年10月10日 17:13
*/
public class Phone implements TypeCInterface {
@Override
public void typec() {
System.out.println("插入手机typec接口");
}
public static void main(String[] args) {
TypeCInterface phone = new Phone();
phone.typec();
TypeCInterface headPhoneAdapter = new HeadPhoneAdapter(new HeadPhoneThreePointFive());
// TypeCInterface headPhoneAdapter2 = new HeadPhoneAdapter2();
headPhoneAdapter.typec();
// headPhoneAdapter2.typec();
}
}
三、适配器模式和装饰者模式的区别
从结构上来说:装饰者模式中装饰者和被装饰者具有共同的超类,而适配器模式是将需要适配的对象以组合的方式实现
从定义上来说,装饰者模式是对对象进行附加功能,而适配器是对对象进行转换,例如一个电源插座,为这个插座添加防短路,防漏电功能,这种就是装饰者模式,而将一个国标的插头转换为英标标的插头,这种就是适配器模式,对目标对象进行转换适配。