【导读】如果多样东西需要使用同一件物品,则需要进行适配,比如只有一个电源插口,但有多个需要用电的(有三相插头,有二相插头),此时就需要一个排查器进行适配,使三相和二相插头都能连接电源。再比如,变压器也是一个适配器,电厂来的是几十万伏的电,但家用电是220V,所以需要将几十万伏的电转成220V的电才能进行使用。
一、定义
将一个类的接口转换成期望的接口,使得原本接口不兼容而不能一起工作的类能一起工作。
但是接口之间是没有层次关系的(也就是继承或实现)。
二、实例
比如电源适配的,一般家用电都是220V,但是手机充电只需要5V,此时手机充电器就相当于是一个适配器,将220V转成手机充电需要的5V。
220V电源:
代码语言:javascript复制public class AC220V {
public int output(){
int output = 220;
System.out.println("输出" output "v");
return output;
}
}
需要的5V电源:
代码语言:javascript复制public interface DC5V {
int output();
}
变压器(也就是充电器):
代码语言:javascript复制public class Transformer implements DC5V{
1、包含了220V的属性
private AC220V ac220V ;
public Transformer(AC220V ac220V) {
this.ac220V = ac220V;
}
@Override
public int output() {
int input = ac220V.output();
2、经过相应的逻辑转换成需要的5V
int output = input / 44;
System.out.println("输入" input "v,输出" output "v");
return output;
}
}
测试类:
代码语言:javascript复制DC5V dc5V = new Transformer(new AC220V());
dc5V.output();
运行结果:
接下来看一下类图:
注意看,原有接口AC220V与需要适配的接口DC5V是没有层次关系的,通过适配者类去进行适配。
三、源码实例
Java的IO使用了适配器模式,Reader和InputStream是没有层次关系的。想要将InputStream转成Reader,就需要用到InputStreamReader这个转换接口。
代码语言:javascript复制Reader reader = new InputStreamReader(new FileInputStream("test"));
它们之间的类结构如下: