一、基本介绍
适配器模式(结构型):让因接口不匹配而不能一起工作的类通过适配器转换后,客户端只需要调用适配器的接口就能让原来不能一起工作的接口协同工作,适配器模式主要是为了解决兼容性的问题,即将多个类的接口都转换为客户端所期望的一个接口。
二、包含角色
1.目标接口:客户端所期望的统一接口。
2.适配者:需要被适配的类。
3.适配器:它是一个转换器,把适配者转换为目标接口。
三、案例及UML类图
案例说明:
当贪官被抓后,会搜出很多现金,由于数额巨大,需要人和数钞机一起工作,但对于人数钞这个类来说,还需要传递一个人作为参数,而机器数钞则不需要参数,这就导致了2个接口不一致,通过适配器模式后,只需要调用同一个接口,即可解决此问题,如果还有新增适配者也能通过新增适配器来解决兼容性问题。
UML类图:
类Target:
public interface Target {
/**
* 统一接口,处理不兼容并且想要协同工作的多个类
* @param adaptee 需要适配的对象
* @return
*/
void computeMoney(Object adaptee,Object param);
}
说明:目标接口,定义客户端所期望的统一接口。
类ArtificialAdapter:
public class ArtificialAdapter implements Target {
@Override
public void computeMoney(Object adaptee, Object param) {
//因为为人工适配器,所以传进来需要适配的事人工数钞适配者
ArtificialComputeMoney artificialComputeMoney = (ArtificialComputeMoney) adaptee;
//因为为人工适配器,所以需要传入一个人
artificialComputeMoney.computeMoney((String) param);
}
}
说明:人工数钱适配器,把人工数钱转换成统一接口。
类MachineAdapter:
public class MachineAdapter implements Target {
@Override
public void computeMoney(Object adaptee, Object param) {
//因为这是机器适配器,所以传进来的为机器数钞适配者
MachineComputeMoney machineComputeMoney = (MachineComputeMoney) adaptee;
machineComputeMoney.computeMoney();
}
}
说明:机器数钱适配器,把机器数钱转换为统一的接口。
类ArtificialComputeMoney:
public class ArtificialComputeMoney {
public void computeMoney(String person) {
System.out.println(person+"开始数钞,每小时数10万。");
}
}
说明:人工数钞操作,适配者,需要传递一个人作为参数。
类MachineComputeMoney:
public class MachineComputeMoney {
public void computeMoney() {
System.out.println("机器开始数钞,每小时数15万。");
}
}
说明:机器数钞操作,适配者,不需要传递参数。
类AdapterTest:
public class AdapterTest {
public static void main(String[] args) {
//对于客户端来说,只需要根据不同的适配者使用不同的适配器调用同一个接口处理即可。
Target machineAdapter = new MachineAdapter();
machineAdapter.computeMoney(new MachineComputeMoney(),null);
Target artificialAdapter = new ArtificialAdapter();
artificialAdapter.computeMoney(new ArtificialComputeMoney(),"许夜");
}
}
说明:测试类及客户端。
四、适用场景
1.适用于因接口不一样导致不能共同工作的类,主要是解决兼容性问题,如苹果手机和安卓手机充电口不一致,可以通过转接口处理,而转接口就类似于适配器。