适配器(Adapter)
我们学习一个模式,首先从名字理解。生活中常见的适配器就是电源适配器。作用是将电压,电流转换成电器需要的电压电流。
我们只需要记住一句话,适配器就是把类接口转换成另一个用户需要的接口(转换接口)。
在iphone11,iphone12拥有不同的通信技术。现在想让11调用5G信号接口,就给它加上一个适配器。
public interface Iphone12 {
void communicateBy5G();
}
public interface Iphone11 {
void communicateBy4G();
}
public class Iphone11Impl implements Iphone11 {
@Override
public void communicateBy4G() {
System.out.println("communicate by 4G!");
}
}
public class Iphone11Adapter implements Iphone12 {
Iphone11 iphone11;
public Iphone11Adapter(Iphone11 iphone11) {
this.iphone11 = iphone11;
}
@Override
public void communicateBy5G() {
iphone11.communicateBy4G();
}
}
/**
** 可以看出虽然创建的对象是iphone12,但实际上使用的是4G通信。
**/
public class Client {
public static void main(String[] args) {
Iphone11 iphone11 = new Iphone11Impl();
Iphone12 iphone12 = new Iphone11Adapter(iphone11);
iphone12.communicateBy5G();
}
}
//communicate by 4G!
Example
可以看出实际上使用的还是4G,适配器的作用是给用的人看起来像是在使用别的类,实际上操作的还是原本对象。
以下是Arrays.asList()在适配器模式下的使用,我相信看完你对适配器的理解会更进一步。
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
再看
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
- 可以看到Arrays.asList(T… a)方法知识按断了一下是否为空,就把地址赋值给了a。
- 所以说,改变list列表的值,原数组的值也会跟着改变。反之也同理。
从中可以看出,调用asList()返回List,但实际上存储结构还是数组。这里将操作数组的操作隐藏起来,让用的人认为是在操作List(转换接口)就是适配器的核心思想。