1、基本介绍
1)适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口,主要目的是兼容性,
让原本因接口不匹配不能一起工作的两个类可以协同工作
2)适配器模式属于结构性模式
3)主要分为3类:类适配器,对象适配器,接口适配器
2、工作原理
1)将一个类的接口转换成另一个接口,让原本不兼容的类可以兼容
2)从用户的角度看不到适配者,是解耦的
3)用户调用适配器转化出来的目标接口方法,适配器再调用被适配者相关接口方法
3、类适配器模式
1)类适配器模式介绍
适配器类(Adapter)通过继承src类,实现dst接口,完成src -> dst类的适配
2)类适配器应用实例
类图
//1、被适配者
/**
* @author houChen
* @date 2020/9/26 7:00
* @Description: 被适配者
*/
public class Voltage220V {
public int output220V(){
int src =220;
System.out.println("电压="+src+"伏");
return src;
}
}
//2、适配接口
/**
* @author houChen
* @date 2020/9/26 7:05
* @Description: 适配接口 :将20伏转成5伏
*/
public interface IVoltage5V {
public int transfer5V();
}
//3、适配器
/**
* @author houChen
* @date 2020/9/26 7:08
* @Description: 适配器
*/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int transfer5V() {
int srcV = output220V();
int dstV =srcV/44;
return dstV;
}
}
//4、使用适配器
public class Phone {
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.transfer5V()==5){
System.out.println("电压为5v~ 可以充电!");
}else{
System.out.println("电压不等于5v~ 不可以充电!");
}
}
}
public class Client {
public static void main(String[] args) {
System.out.println("类适配器模式~~~~~~~~~~");
Phone phone =new Phone();
phone.charging(new VoltageAdapter());
}
}
3)类适配器注意事项
-
java是单继承机制,类适配器需要继承src类这一点算是缺点,因为这要求dst必须是接口,有一定的局限性
-
由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵 活性增强了
4、对象适配器模式
1)基本介绍
-
对象适配器模式基本思路和类适配器模式相同,只是将适配器类(Adapter)做修改,不是继承src类,而是持有src类的实例,持有src类的实例并且实现dist类的接口,完成src -> dst 的适配
-
对象适配器模式是适配器模式中常用的一种
2)上述电压问题改造为对象适配器模式
//1、被适配者
/**
* @author houChen
* @date 2020/9/26 7:00
* @Description: 被适配者
*/
public class Voltage220V {
public int output220V(){
int src =220;
System.out.println("电压="+src+"伏");
return src;
}
}
//2、适配接口
/**
* @author houChen
* @date 2020/9/26 7:05
* @Description: 适配接口 :将20伏转成5伏
*/
public interface IVoltage5V {
public int transfer5V();
}
//3、适配器
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int transfer5V() {
int dstV =0;
if(voltage220V!=null){
int srcV = voltage220V.output220V();
dstV =srcV/44;
}
return dstV;
}
}
//4、使用适配器
public class Phone {
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.transfer5V()==5){
System.out.println("电压为5v~ 可以充电!");
}else{
System.out.println("电压不等于5v~ 不可以充电!");
}
}
}
public class Client {
public static void main(String[] args) {
System.out.println("对象适配器模式~~~~~~~~~~");
Phone phone =new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
3)对象适配器模式注意事项和细节
-
对象适配器和类适配器算是一种思想,实现方式不同,用组合来代替继承
-
使用成本更低,更灵活