概念:
适配器模式将一个类的接口,转换为客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
术语:
- source:待适配的类/对象/接口
- Adapter:适配器
- destination:适配后可用的类/对象/接口
分类:
-
类适配器模式
Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配 -
对象适配器模式
将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination 类接口,完成source->Destination 的适配 -
接口适配器模式
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求适用于一个接口不想使用其所有的方法的情况
案例:
需求:电源适配的项目,要让手机能够使用220V的交流电;注意,手机只接受5.5V的电压;
适配器模式分类三种体现形式思想都大同小异,这里就只介绍最常用的 对象适配器模式;
使用适配器前:
package com.javaxl.design.adapter.before;
/**
* @author 借我丹青妙笔
*
* 220V的电压
*/
public class Voltage220V {
private double voltage;
public Voltage220V() {
this.voltage = 220;
}
public double getVoltage() {
return voltage;
}
public void setVoltage(double voltage) {
this.voltage = voltage;
}
}
/**
*手机类
*/
public class Phone {
// 充电
public void charge(Voltage220V voltage220V){//在这里我们应该传入的是一个充电器,而非220v电压。
double voltage = voltage220V.getVoltage() / 40;//这里通过手动除以40虽然可以得到我们需要的5.5v的电压。但这么设计不合理。但不可否认这样能得到我们需要的值。
System.out.println("最终手机充电所用电压:" + voltage + "V");
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
// 已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
// 还一种方案:新增5V的一个Voltage5V,Voltage的电压可以被手机使用
// 但是这违背现实生活现象,现实生活中只有220V的电源,其他的电源都是通过适配得来的
phone.charge(new Voltage220V());
}
}
使用适配器模式后:
package com.javaxl.design.adapter.after;
/**
* @author 借我丹青妙笔
*
* 220V的电压
*/
public class Voltage220V {
private double voltage;
public Voltage220V() {
this.voltage = 220;
}
public double getVoltage() {
return voltage;
}
public void setVoltage(double voltage) {
this.voltage = voltage;
}
}
/**
* 目标接口
*/
interface Voltage5V{
double getVoltage();
}
/**
* 适配器:里面封装了source源到destination目标的过程
*/
class VoltageAdapter implements Voltage5V{
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public double getVoltage() {
return voltage220V.getVoltage() / 40;
}
}
package com.javaxl.design.adapter.after;
public class Phone {
// 充电
public void charge(Voltage5V voltage5V){
double voltage = voltage5V.getVoltage();
System.out.println("最终手机充电所用电压:" + voltage + "V");
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
// 已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
// VoltageAdapter适配器对Voltage220V这个不能直接使用的电源适配后就可以使用了
phone.charge(new VoltageAdapter(new Voltage220V()));
}
}
两张图让你了解适配器起到的作用:
注意事项和细节:
Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作
应用:
SpringMvc框架中HandlerAdapter类、
安卓中监听适配器类中就使用了接口适配器(上拉、下拉…)
学习记录,若有错误,欢迎指正。
作者:借我丹青妙笔