适配器模式及类、对象、接口适配器
1.基本介绍
(1) 基本介绍
- 适配器模式(Adapter Pattern),又叫包装器模式。将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性。让原本因接口不匹配不能一起工作的两个类可以协同工作。
- 适配器模式属于结构型模式
(2) 分类
- 类适配器
- 对象适配器
- 接口适配器
(3) 工作原理
- 将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
- 从用户的角度看不到被适配者,是解耦的。
- 用户调用适配器转化出来的目标接口方法,适配器调用被适配者的相关方法。
- 用户收到返回结果,感觉只是和目标接口交互。
2.类适配器
(1) 基本介绍
适配器类(Adapter),通过继承被适配者类(Src),实现目标类(Tar)的接口,完成Src类 -> Tar类的适配。
(2) 使用类适配器模式解决电压问题
/** 被适配着:插座,输出220V电压 **/
public class Voltage220V{
public int output220V(){
sout("输出220V电压");
return 220;
}
}
/** 适配接口:提供输出5V的电压方法 **/
public interface IVoltage5V{
int output5V();
}
/** 适配器类:实现输出5V的电压方法 **/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V(){
int src = output220V(); // 使用被适配类的方法获取220V
src = src / 44; // 降压
return src;
}
}
/** 调用者:手机充电,因为不能直接调用输出220V的电压类,所以调用适配器类(接口) **/
public class Iphone{
public void charging(IVoltage5V iVoltage5V){
int v = IVoltage5V.output5V();
sout("充电中...电压:" + v);
}
}
public class Do{
psvm(){
Iphone iphone = new Iphone();
iphone.charging(new VoltageAdapter());
}
}
(3) 注意事项
- Java是单继承机制,所以类适配器需要继承被适配类是一个缺点。
- 被适配类中的方法会在适配器中暴露出来,增加了使用成本。
- 由于继承了被适配类,所以适配器可以根据需求重写被适配类的方法,使适配器类更加灵活。
3.对象适配器
(1) 基本介绍
- 基本思路与类适配器模式相同,只是将适配器类(Adapter)做修改,不再继承被适配类(Src),而是持有被适配类的实例。
- 持有被适配类的实例,实现目标类的接口,完成Src-> Tar的适配。
- 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
- 对象适配器是适配器模式常用的一种
(2) 使用对象适配器模式解决电压问题
/** 被适配着:插座,输出220V电压 **/
public class Voltage220V{
public int output220V(){
sout("输出220V电压");
return 220;
}
}
/** 适配接口:提供输出5V的电压方法 **/
public interface IVoltage5V{
int output5V();
}
/** 适配器类:实现输出5V的电压方法 **/
public class VoltageAdapter implements IVoltage5V{
private Voltage220V voltage220;
public void VoltageAdapter(Voltage220V vol){
voltage220 = vol;
}
@Override
public int output5V(){
int src = voltage220.output220V(); // 使用被适配类的方法获取220V
src = src / 44; // 降压
return src;
}
}
/** 调用者:手机充电,因为不能直接调用输出220V的电压类,所以调用适配器类(接口) **/
public class Iphone{
public void charging(IVoltage5V iVoltage5V){
int v = IVoltage5V.output5V();
sout("充电中...电压:" + v);
}
}
public class Do{
psvm(){
VoltageAdapter voltage = new VoltageAdapter(new Voltage220V());
Iphone iphone = new Iphone();
iphone.charging(voltage);
}
}
(3) 注意事项
- 对象适配器和类适配器是同一种思想,只不过实现方式不同。
- 对象适配器根据合成复用原则,使用组合替代继承。它解决了类适配器必须继承配适配器类的局限性。
- 使用成本更低、更灵活。